用javascript动态加载javascript脚本/css样式表
// 命名空间对象
Namespace = new Object();
Namespace.register = function(fullname) {
try {
var nsArray = fullname.split(".");
var strNS = "";
var strEval = "";
for (var i = 0; i < nsArray.length; i++) {
if (strNS.length > 0)
strNS += ".";
strNS += nsArray[i];
strEval += " if(typeof(" + strNS + ") =='undefined') " + strNS + " = new Object(); ";
}
if (strEval != "") eval(strEval);
} catch (e) { alert(e.message); }
}
//注册命名空间
Namespace.register('Common');
/**动态加载资源文件(js 文件和 css 文件)**/
Common.srcLoader = {
/**入口函数**/
/* fileList: 需要动态加载的资源列表 */
/* callback: 所有资源都加载完后调用的回调函数,通常是页面上需要onload就执行的函数 */
/* scope: 作用范围 */
、、/* preserveOrder: 是否保持脚本顺序 */
Load: function(fileList, callback, scope, preserveOrder) {
var scope = scope || this,
//var scope=this,//默认作用范围是当前页面
head = document.getElementsByTagName("head")[0],
fragment = document.createDocumentFragment(),
numFiles = fileList.length,
loadedFiles = 0;
// Loads a particular file from the fileList by index. This is used when preserving order
var loadFileIndex = function(index) {
head.appendChild(
Common.srcLoader.buildScriptTag(fileList[index], onFileLoaded)
);
};
/**
* 调用回调函数,当所有文件都加载完后调用
*/
var onFileLoaded = function() {
loadedFiles++;
//如果当前文件是最后一个要加载的文件,则调用回调函数,否则加载下一个文件
if (numFiles == loadedFiles && typeof callback == 'function') {
callback.call(scope);
} else {
if (preserveOrder === true) {
loadFileIndex(loadedFiles);
}
}
};
if (preserveOrder === true) {
loadFileIndex.call(this, 0);
} else {
for (var i = 0, len = fileList.length; i < len; i++) {
fragment.appendChild(this.buildScriptTag(fileList[i], onFileLoaded));
}
head.appendChild(fragment);
}
},
//构造javascript和link 标签
buildScriptTag: function(filename, callback) {
var exten = filename.substr(filename.lastIndexOf('.') + 1);
if (exten == 'js') {
var script = document.createElement('script');
script.type = "text/javascript";
script.src = filename;
//IE has a different way of handling <script> loads, so we need to check for it here
if (script.readyState) {
script.onreadystatechange = function() {
if (script.readyState == "loaded" || script.readyState == "complete") {
script.onreadystatechange = null;
callback();
}
};
} else {
script.onload = callback;
}
return script;
}
if (exten == 'css') {
var style = document.createElement('link');
style.rel = 'stylesheet';
style.type = 'text/css';
style.href = filename;
callback();
return style;
}
}
}
使用:在页面上使用
引用以上脚本是必须的让后在页面上加入 类似的代码:
<script type="text/javascript">
//根据需要加载js文件,并设置回调函数
Common.srcLoader.Load(
[
'../js/jquery.js',
'../js/ext-base.js',
'../js/ext-all.js',
'../js/ext_ux.js',
'../js/FBaseFunc.js',
'../js/FBaseJQueryFunc.js',
'../js/FBaseExtFunc.js',
'js/SchoolGradeTestCountDrillable.js',
'../js/lovcombo.js',
'../RptService/amchart/swfobject.js'
],
loadPage,
null,
true
);
//回调函数
function loadPage() {
//设置全局相对路径
gRPath = "../"
target = "amcharts_1302230008081";
reportID = "1";
userID = "1";
Ext.onReady(function() {
//设置Cookie操作对象
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
//标题区域
var oleTitleInfo = new Ext.BoxComponent({ el: 'div_func_title', height: 50, region: "north" });
DoSomething();
});
}
</script>
动态加载脚本最大的好处在于减少页面初始化的响应时间,避免不需要加载外部 javascript