转自:
http://www.ajaxbbs.net/post/extjs/ExtJs-dynamic-LoadJS-Class.html
ScriptLoader = function
() {
this
.timeout = 30
;
this
.scripts = [];
this
.disableCaching = false
;
this
.loadMask = null
;
};
ScriptLoader.prototype
= {
showMask: function
() {
if
(!this
.loadMask) {
this
.loadMask = new
Ext.LoadMask(Ext.getBody());
this
.loadMask.show
();
}
},
hideMask: function
() {
if
(this
.loadMask) {
this
.loadMask.hide
();
this
.loadMask = null
;
}
},
processSuccess: function
(response) {
this
.scripts[response.argument.url] = true
;
window
.execScript ? window
.execScript(response.responseText) : window
.eval(response.responseText);
if
(response.argument.options.scripts.length == 0
) {
this
.hideMask();
}
if
(typeof
response.argument.callback == 'function'
) {
response.argument.callback.call(response.argument.scope);
}
},
processFailure: function
(response) {
this
.hideMask();
Ext.MessageBox.show
({title: 'Application Error'
, msg: 'Script library could not be loaded.'
, closable: false
, icon: Ext.MessageBox.ERROR, minWidth: 200
});
setTimeout
(function
() { Ext.MessageBox.hide
(); }, 3000
);
},
load
: function
(url, callback) {
var
cfg, callerScope;
if
(typeof
url == 'object'
) { // must be config object
cfg = url;
url = cfg.url;
callback = callback || cfg.callback;
callerScope = cfg.scope;
if
(typeof
cfg.timeout != 'undefined'
) {
this
.timeout = cfg.timeout;
}
if
(typeof
cfg.disableCaching != 'undefined'
) {
this
.disableCaching = cfg.disableCaching;
}
}
if
(this
.scripts[url]) {
if
(typeof
callback == 'function'
) {
callback.call(callerScope || window
);
}
return
null
;
}
this
.showMask();
Ext.Ajax.request({
url: url,
success: this
.processSuccess,
failure: this
.processFailure,
scope: this
,
timeout: (this
.timeout*1000
),
disableCaching: this
.disableCaching,
argument: {
'url'
: url,
'scope'
: callerScope || window
,
'callback'
: callback,
'options'
: cfg
}
});
}
};
ScriptLoaderMgr = function
() {
this
.loader = new
ScriptLoader();
this
.load
= function
(o) {
if
(!Ext.isArray(o.scripts)) {
o.scripts = [o.scripts];
}
o.url = o.scripts.shift();
if
(o.scripts.length == 0
) {
this
.loader.load
(o);
} else
{
o.scope = this
;
this
.loader.load
(o, function
() {
this
.load
(o);
});
}
};
};
ScriptMgr = new
ScriptLoaderMgr();
构建一个one page one application的应用,动态的加载js组件是关键,虽然看到了5,6种解决方案,可是还是没办法做的很通用,作为一个项目组件。突然发现ExtJs的官方论坛确实是个好地方,由很多好用的资源,可是E文还是没有母语看这舒服,把最好的方案记录下。原文地址:http://extjs.com/forum/showthread.php?t=37897
使用示例:
ScriptMgr.load
({
scripts: ['/js/other-prerequisite.js'
, '/js/other.js'
],
callback: function
() {
var
other = new
OtherObject();
alert(other); //just loaded
}
});