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


Posted in Javascript onSeptember 13, 2011

这里只讨论支持并行下载的浏览情况,大致分为两种,一种是按加向DOM树中加的顺序执行,另一种按下载完成的先后顺序执行;这样如果js文件间有依赖关系的话,且是按下载顺序执行,且在没有缓存的情况下就会报错(通常的情况下第一次执行会报错,http返回状态200,如果缓存未禁用,http状态是304,就不会报错了)
而ie就是按http下载完成的先后顺序执行js代码的,首先看下面的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-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><!-- Page end! --> 
<script type="text/javascript"> 
//<![CDATA[ 
var js = document.createElement('script'); 
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].appendChild(js); 
} 
}; 
}else{ 
document.getElementsByTagName('head')[0].appendChild(js); 
js.onload = function(){ 
alert('loaded not in ie!'); 
}; 
} 
//]]> 
</script> 
</body> 
</html>

其中动态加载的alert.js文件中内容为:alert('in alert.js');
经过测试(ie8),可以发现弹出的内容先后为:loaded、in alert.js、complete
查资料可得ie下向DOM中添加script时有onreadystatechange事件(其它浏览器有onload事件),而事件中js.readyState的状态变化为:loading(下载中)、loaded(下载完成)、complete(代码执行完成)
从代码中可以看出我是在事件中才向DOM中添加创建的scrip结点的……
因此可以得出ie在创建scrip结点并给src赋值时就开始有http下载了,这与其它浏览器完全不同(其它浏览器是要把script结点加到DOM中才会有http下载的),而把scrip结点向DOM树中添加后才开始执行代码。
有了这些结论我们就可以解决ie下并行下载顺序执行的问题了;有两种方案:一种是边下载边顺序执行,另一种是全下载完再顺序执行。
两种各有好处,这里给出后一种情况的代码(loader.js):
/* 
* Author: JaiHo 
*/ 
(function(window){ 
var DOMLoader = (function(){ 
var DOMLoader = function(){ 
return new DOMLoader.prototype.init(); 
}; 
DOMLoader.prototype = { 
jsList:[], js_all:0, loaded_js:0, 
head:document.getElementsByTagName('head')[0], 
init:function(){ }, 
create_node:function(src){ 
var js = document.createElement('script'); 
js.type = 'text/javascript'; 
this.bindWait(js); 
this.jsList[this.jsList.length] = js; 
js.src = src; 
}, 
loadJS:function(list){ 
len = list.length; 
for(var i=0; i<len; i++){ 
if( i==len-1 ) 
this.js_all = len; 
this.create_node(list[i]); 
} 
return this; 
}, 
bindWait:function(js){ 
if(arguments.callee.caller!==this.create_node) return; 
var that = this; 
if(js.readyState){ 
js.onreadystatechange = function(){ 
if( js.readyState == 'loaded' ){ 
that.loaded_js++; 
if( that.js_all == that.loaded_js ){ 
that.head.appendChild( that.jsList.shift() ); 
} 
} 
if ( js.readyState == "complete" ){ 
js.onreadystatechange = null; 
if( that.jsList.length ){ 
that.head.appendChild( that.jsList.shift() ); 
} 
} 
}; 
}else{ 
js.onload = function(){ 
alert('not in ie!'); 
}; 
} 
return this; 
} 
}; 
DOMLoader.prototype.init.prototype = DOMLoader.prototype; 
return window.DOMLoader = DOMLoader; 
})(); 
})(window);

测试例子如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-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=gb2312" /> 
<title>Loader</title> 
<meta http-equiv="Content-language" content="zh-CN" /> 
<style type="text/css" media="all"> 
</style> 
</head> 
<body> 
<div> 
</div> 
<script type="text/javascript" src="loader.js"></script> 
<script type="text/javascript"> 
//<![CDATA[ 
window.onload = function(){ 
var loader = DOMLoader(); 
loader.loadJS([ 'json.js', 'jquery-1.5.min.js', 'test.js' ]); 
}; 
//]]> 
</script> 
</body> 
</html>

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

      可以看出加载的3个js文件是并行下载的。
      对于其它浏览器有动态加载js文件的并行下载和顺序执行问题的情况,目前还没有相对完美的解决方案(如果有了请指教一下。。),单从这个方面,个人觉得ie的这个onreadystatechange事件方案相对好些。

Javascript 相关文章推荐
基于jQuery的一个扩展form序列化到json对象
Dec 09 Javascript
关于hashchangebroker和statehashable的补充文档
Aug 08 Javascript
深入分析Cookie的安全性问题
Mar 01 Javascript
学习JavaScript设计模式之责任链模式
Jan 18 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
Aug 16 Javascript
值得分享的bootstrap table实例
Sep 22 Javascript
微信小程序 picker 组件详解及简单实例
Jan 10 Javascript
jQuery树控件zTree使用方法详解(一)
Feb 28 Javascript
JavaScript实现多态和继承的封装操作示例
Aug 20 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
Sep 29 Javascript
vue实现购物车案例
May 30 Javascript
JQuery获得内容和属性方法解析
May 30 jQuery
使用Json比用string返回数据更友好,也更面向对象一些
Sep 13 #Javascript
TextArea不支持maxlength的解决办法(jquery)
Sep 13 #Javascript
JQuery与JSon实现的无刷新分页代码
Sep 13 #Javascript
js Event对象的5种坐标
Sep 12 #Javascript
由JavaScript中call()方法引发的对面向对象继承机制call的思考
Sep 12 #Javascript
腾讯UED 漂亮的提示信息效果代码
Sep 12 #Javascript
jQuery的.live()和.die() 使用介绍
Sep 10 #Javascript
You might like
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
mysql_escape_string()函数用法分析
2016/04/25 PHP
PHP实现页面静态化的超简单方法
2016/09/06 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
使用XHProf查找PHP性能瓶颈的实例
2017/12/13 PHP
Laravel中9个不经常用的小技巧汇总
2019/04/16 PHP
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
jQuery对val和atrr(&quot;value&quot;)赋值的区别介绍
2014/09/26 Javascript
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
jquery实现浮动的侧栏实例
2015/06/25 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
2020/12/24 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
如何通过python计算圆周率PI
2020/11/11 Python
6种非常炫酷的CSS3按钮边框动画特效
2016/03/16 HTML / CSS
大学毕业后的十年规划
2014/01/07 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
旅游业大学生创业计划书
2014/01/31 职场文书
本科生就业推荐信
2014/05/19 职场文书
办公室文员岗位职责范本
2014/06/12 职场文书
一份文言文检讨书
2014/09/13 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
房屋认购协议书
2015/01/29 职场文书
酒店前台接待岗位职责
2015/04/02 职场文书
Ajax实现异步加载数据
2021/11/17 Javascript