js 动态载入

使用ext的时候 ,往往需要载入太多的js文件,这些都写在main.jsp中,我自己都看的有点乱,所以就想到用动态引入js来显的好看点

main.jsp部分内容

<base href="<%=basePath%>"/>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首页</title>
<style type="text/css">
</style>
<link rel="shortcut icon" href="images/company/logo.ico" />
<script type="text/javascript" src="js/guild.js"></script>

<body>

.......

guild.js(引导文件)部分内容

/**
 * 引导js
*/
function $import(path, type){
var scripts = document.getElementsByTagName("script");
var cssLinks = document.getElementsByTagName("link");
if(type=="css"){
for (i = 0; i < cssLinks.length; i++) {
if(cssLinks[i].href.match(path)){
return;
}
}
document.write("<" + "link href=\""  + path +"."+type+"\" rel=\"stylesheet\" type=\"text/css\"></" + "link>");
}else if(type=="js"||type=="gzjs"){
for (i = 0; i < scripts.length; i++) {
if(scripts[i].src.match(path)){
return;
}
}
document.write("<" + "script  type=\"text/javascript\" src=\"" + path +"."+type+"\"></" + "script>");
}
}
$import("plugIn/ext3.2/resources/css/ext-all","css");
$import("css/main","css");
$import("css/menu","css");
$import("plugIn/ext3.2/ext-base","js");
$import("plugIn/ext3.2/ext-all","gzjs");
$import("js/common/ExtUtil","js");
$import("js/common/dominUtil","js");
$import("js/common/CommonUtil","js");

$import("js/component/MenuTree","js");

......

但以上方法有它的局限性,他无法保证各js文件执行的顺序,也没法保证其会执行,这样在比如ajax动态引入时候,常常报一些在上面定义过,却还报未定义的错误

这时候需要运用window.execScript和 eval.call的方法

部分代码如下

function $importAjax(url) {
    var ajaxResut = getAjaxTextFromUrl({
      dataUrl:url,
      async:false,
      method:"get"
      });
    if (window.execScript) {
        try {
            window.execScript(ajaxResut);
            
        }
        catch (err) {
            return false;
        }
        return true;
    } else {
        eval.call(window, ajaxResut);//执行动态加载
        return true;
    }
    return false;
}
以上皆是为了ext opoa做准备的,我这采取的思路是每个功能拆分2个js文件,一个核心文件(core具体的功能类),一个执行文件(module实例化功能类),以每个功能为一个对象的观点来处理,需要的时候载入core文件,执行module文件

附部分代码

       loadModel: function(id,tab,path){ 
        //定义模块变量
        var model;
       
        if(this[id]){
            //如果模块类已存在,就直接实例化
            model = new this[id](tab);
        }else{
            this.loadMask.show();
            $importAjax('/js/core/userManager/core.js');
            Ext.Ajax.request({  
                method:'GET',
                url: 'js/core/'+path+'/module.js',  
                scope: this,  
                success: function(response){
                    //获取模块类 
                    this[id] = eval(response.responseText);  
                    //实例化模块类
                    model = new this[id](tab);
                    this.loadMask.hide();  
                }  
            });
        }
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值