使用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();
}
});
}
}