手机版

ie下动态添加js文件的方法

时间:2021-10-17 来源:互联网 编辑:宝哥软件园 浏览:

这里只讨论支持并行下载的浏览情况,大致可以分为两种:一种是按照添加到DOM树的顺序执行,一种是按照下载完成的顺序执行;这样,如果js文件之间存在依赖关系,则按照下载顺序执行,不缓存就报错(通常第一次执行报错,http返回状态200;如果缓存未被禁用,http状态将为304,因此不会报告错误),而ie按照http下载完成的顺序执行js代码。首先看下面的代码:复制代码如下:DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN ' ' http://www . w3 . org/TR/XHTML 1/DTD/XHTML L1-Transitional . DTD ' html xmlns=' http://www . w3 . org/1999/XHTML ' XML : lang=' zh-CN ' lang=' zh-CN ' head meta http-equiv=' Content-Type ' Content=' text/html;charset=utf-8 '/title model/title meta http-equiv=' Content-language ' Content=' zh-CN '/head body div id=' page '/div!-页面结束!-脚本类型='text/javascript' //![CData[var js=document . CreateElement('脚本');js . type=' text/JavaScript ';js . src=' alert . js ';if(js . readystate){ js . onreadystatechange=function(){ if(js . readystate==' loaded ' | | js . readystate==' complete '){ alert(js . readystate);document . getelementsbytagname(' head ')[0]。append child(js);} };} else { document . getelementsbytagname(' head ')[0]。append child(js);js.onload=function(){ alert('未在ie中加载!');};}//]]/script/body/html动态加载的alert.js文件包含:alert(' in alert . js ');根据测试(ie8),可以发现弹出内容是加载的、inallert.js的、完整的。在ie下给DOM添加脚本时,有onload事件(其他浏览器有onload事件)。在事件中,js.readyState的状态变化为:加载(下载)、加载(下载完成)和完成(代码执行完成)。从代码中可以看出,我只是在事件中将创建的脚本节点添加到了DOM中……因此,可以得出结论,ie在创建脚本节点并为src赋值时开始下载http。这与其他浏览器完全不同(其他浏览器只需要将脚本节点添加到DOM中进行http下载),但只有在DOM树中添加脚本节点后,它们才能开始执行代码。利用这些结论,我们可以解决ie下的并行下载顺序执行问题。有两种方案:一种是边下载边按顺序执行,另一种是下载完成后按顺序执行。

两种各有好处,这里给出后一种情况的代码(loader.js):复制代码代码如下: /* * Author: JaiHo */(函数(窗口){ var DOMLoader=(函数(){ var DOMloader=function()}返回新的domLoader。原型。init();};多姆拉德。prototype={ jslist :[],js_all:0,loaded_js:0,head :文档。getelementsbytagname(' head ')[0],init:function(){ },create _ node : function(src){ var js=document。create element(' script ');js。type=' text/JavaScript ';这个。bindWait(js);这个。jslist[这个。jslist。length]=js;js.src=src},Loadjs : FuncTion(list){ len=list。长度;for(var I=0;伊琳;I){ if(I==len-1)这个。js _ all=len这个。create _ node(列表[I]);}退回这个;},BindWait : FuncTion(js){ if(arguments。打电话的人。来电者!==this.create_node)返回;变量=这个;if(js。readystate){ js。onreadystatechange=function(){ if(js。readystate==' loaded '){即。loaded _ js如果(那个。js _ all==那个。loaded _ js){那个。头部。appendchild(那个。jslist。shift());} } if(js。readystate==' complete '){ js。onreadystatechange=null如果(那个。jslist。长度){那个。头部。appendchild(那个。jslist。shift());} } };} else { js。onload=function(){ alert('不在工程师协会中!');};}退回这个;} };DOM加载器。原型。初始化。原型=DOM加载器。原型;返回窗口. DOMLoader=DOMLoader })();})(窗口);测试例子如下:复制代码代码如下:DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN ' ' http://www .w3。L1-过渡时期。DTD ' html xmlns=' http://www .w3。org/1999/XHTML ' XML : lang=' zh-CN ' lang=' zh-CN ' head meta http-equiv=' Content-Type ' Content=' text/html;charset=GB 2312 '/title loader/title meta http-equiv=' Content-language ' Content=' zh-CN '/style type=' text/CSS ' media=' all '/style/head body div/div脚本类型=' text/JAVAScript ' src=' http :加载程序。js /脚本脚本类型='text/javascript' /![CData[窗口。onload=function(){ var loader=DOM lloader();loader.loadJS([ 'json.js ',' jquery-1.5.min.js ',' test。js ']);};//]]/脚本/正文/html

可以看到三个加载的js文件是并行下载的。动态加载的js文件在其他浏览器中并行下载和顺序执行的问题,目前还没有相对完善的解决方案(如果有,请指教。),单从这方面来说,我个人认为ie的这个onreadystatechange事件方案相对更好。

版权声明:ie下动态添加js文件的方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。