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之六 缓存数据功能介绍
Jun 21 Javascript
JsDom 编程小结
Aug 09 Javascript
Iframe 自动适应页面的高度示例代码
Feb 26 Javascript
JS判断变量是否为空判断是否null
Jul 25 Javascript
javascript实现详细时间提醒信息效果的方法
Mar 11 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
js实现的后台左侧管理菜单代码
Sep 11 Javascript
JavaScript 对象详细整理总结
Sep 29 Javascript
如何制作幻灯片(代码分享)
Jan 06 Javascript
详解webpack require.ensure与require AMD的区别
Dec 13 Javascript
微信小程序如何调用json数据接口并解析
Jun 29 Javascript
layui多iframe页面控制定时器运行的方法
Sep 05 Javascript
使用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中的日期及时间
2006/11/23 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
php中hashtable实现示例分享
2014/02/13 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
匹配任意字符的正则表达式写法
2010/04/29 Javascript
html向js方法传递参数具体实现
2013/08/08 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
node.js的事件机制
2017/02/08 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
Node.js log4js日志管理详解
2018/07/31 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
python随机生成指定长度密码的方法
2015/04/04 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
python字符串的方法与操作大全
2018/01/30 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
Python判断telnet通不通的实例
2019/01/26 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
2014自主招生自荐信策略
2014/01/27 职场文书
批评与自我批评材料
2014/02/15 职场文书
2016年离婚协议书范文
2016/03/18 职场文书