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 相关文章推荐
Add a Picture to a Microsoft Word Document
Jun 15 Javascript
javascript 程序库的比较(一)之DOM功能
Apr 07 Javascript
jquery入门—访问DOM对象方法
Jan 07 Javascript
关于js遍历表格的实例
Jul 10 Javascript
动态加载脚本提升javascript性能
Feb 24 Javascript
JS实现图片高亮展示效果实例
Nov 24 Javascript
Bootstrap每天必学之标签与徽章
Nov 27 Javascript
vue省市区三联动下拉选择组件的实现
Apr 28 Javascript
jQuery正则验证注册页面经典实例
Jun 10 jQuery
如何在vue里添加好看的lottie动画
Aug 02 Javascript
轻松学习JavaScript函数中的 Rest 参数
May 30 Javascript
浅谈vuex中store的命名空间
Nov 08 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实现encode64编码类实例
2015/03/24 PHP
PHP实现在线阅读PDF文件的方法
2015/06/17 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
php 的反射详解及示例代码
2016/08/25 PHP
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
JavaScript队列函数和异步执行详解
2017/06/19 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
微信小程序实现上传图片功能
2018/05/28 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python中去空格函数的用法
2014/08/21 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
详解Python中的路径问题
2020/09/02 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
La Senza官网:北美顶尖性感内衣品牌
2018/08/03 全球购物
施华洛世奇西班牙官网:SWAROVSKI西班牙
2019/06/06 全球购物
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
护士实习鉴定范文
2013/12/22 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android
git stash(储藏)的用法总结
2022/06/25 Servers
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS
redis lua限流算法实现示例
2022/07/15 Redis
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技