下面是2种动态加载js的方法,这2种方法都很好用,速度上感觉不出差别,当加载了一次之后,第2次以
后都不会重复加载,这样的话就不会每次点击都向服务器下载js!
这2种方法中,我个人觉得第2种是比较好用,它可以在callback里直接使用刚加载的js。
//第1种动态加载js function GetHttpRequest() { if ( window.XMLHttpRequest )
return new XMLHttpRequest() ; else if ( window.ActiveXObject ) // IE return new ActiveXObject("MsXml2.XmlHttp") ; }
function loadJS(jsName) { var oXmlHttp = GetHttpRequest() ; oXmlHttp.onreadystatechange = function() { if ( oXmlHttp.readyState == 4 ) { if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 ) { txt = oXmlHttp.responseText; var scriptTag = document.getElementById(id); var oHead = document.getElementsByTagName('HEAD').item(0); var oScript= document.createElement("script"); if (scriptTag) oHead.removeChild(scriptTag ); oScript.id = "loadJS_id"; oScript.type = "text/javascript"; oScript.src= jsName+".js" ; oHead.appendChild(oScript); } else { alert('操作失败:' + oXmlHttp.statusText + '(' + oXmlHttp.status + ')' ) ; } } } url = '' + jsName + '.js'; oXmlHttp.open('GET', url, true); oXmlHttp.send(null); }
|
//使用:
if(true) { tbar.push({ text : '新增', tooltip : '新增一条记录', iconCls : _addIco, handler : function() { var el = Ext.get("loadJS_id"); if(!el) { loadJS("addTest"); //addTest,js文件名 } add(); } }, '-'); }
|
//第2种动态加载js
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(); |
//使用:
{ id : "d_m_sub3", xtype : "tbbutton", text : "完成任务", iconCls : "sub2", handler : function(){ ScriptMgr.load({ scripts: ['/baoa/oaTask/oaTask_task7/oaTask_task7_browse.js','/baoa/oaTask/oaTask_task8/oaTask_task8_browse.js'], callback: function() { var n = Ext.getCmp("rightPanelId").getComponent("d_m_sub3"); if (!n) { // 判断是否已经打开该面板 n = Ext.getCmp("rightPanelId").add ({ id:"d_m_sub3", title:'完成任务', closable : true, items :[ {autoScroll : true,border:false,layout:'form',items:[Lbo_oaTask_task7_browse(param).prop.grid,Lbo_oaTask_task8_browse(param).prop.grid]} ] }); } Ext.getCmp("rightPanelId").setActiveTab(n); Ext.getCmp("rightPanelId").doLayout(); } }); } }
ScriptMgr.load ({ scripts: ['/baoa/oaTask/oaTask_task/oaTask_task_add.js'], callback: function() { showAddForm(); } });
|