利用jQuery的deferred对象实现异步按顺序加载JS文件


Posted in Javascript onMarch 17, 2013

前段时间看了阮一峰的jQuery的deferred对象详解一文,对jQuery中的deferred的用法了一些了解,今天看到园子里的一篇文章:关于重构JS前端框架的失败经验(顺便怀念那些死去的代码),于是把我之前写的一个利用jQuery的deferred异步按顺序加载JS文件方案分享出来,欢迎指正。

如果你现在对jQuery中的deferred还不了解,强烈建议你看一下阮一峰的jQuery的deferred对象详解一文。
加载JS文件的代码如下:

/* 
Loading JavaScript Asynchronously 
loadScript.load(["a.js", "b.js"]); 
*/ 
var loadScript = (function() { 
var loadOne = function (url) { 
var dtd = $.Deferred(); 
var node = document.createElement('script'); 
node.type = "text/javascript"; 
var onload = function(){ 
dtd.resolve(); 
}; 
$(node).load(onload).bind('readystatechange', function(){ 
if (node.readyState == 'loaded'){ 
onload(); 
} 
}); 
document.getElementsByTagName('head')[0].appendChild(node); 
node.src = url; 
return dtd.promise(); 
}; 
var load = function(urls) { 
if(!$.isArray(urls)) { 
return load([urls]); 
} 
var ret = []; 
for (var i = 0; i < urls.length; i++) { 
ret[i] = loadOne(urls[i]); 
}; 
return $.when.apply($, ret); 
} 
return { 
load: load 
}; 
})();

代码比较简单,这里就不解释了,下面给个调用示例。

例如项目中有两个JS文件:a.js和b.js,代码如下:

a.js:

var a = "i am in a.js"; 
var b = "i am in a.js";

b.js:
var a = "i am in b.js"; 
var b = "i am in b.js";

如果我们想先载入b.js,后载入a.js,示例代码如下:
<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Loading JavaScript Asynchronously</title> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"type="text/javascript"></script> 
<script src="jls.js" type="text/javascript"></script> 
</head> 
<body> 
<script type="text/javascript"> 
loadScript.load(["b.js", "a.js"]).done(function() { 
test(); 
}); 
function test(){ 
console.log("var a = " + a + " , var b = " + b); 
} 
</script> 
</body> 
</html>

结果如下:

利用jQuery的deferred对象实现异步按顺序加载JS文件

这里我们可以看到,b.js中定义的变量被a.js中的覆盖了。

转到Elements面板,我们可以看到b.js和a.js被顺序地加到了head中:

利用jQuery的deferred对象实现异步按顺序加载JS文件

对此类问题,欢迎大家分享自己的方案。

Javascript 相关文章推荐
JS加ASP二级域名转向的代码
May 17 Javascript
Javascript常考语句107条收集
Mar 09 Javascript
基于Jquery的标签智能验证实现代码
Dec 27 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
Apr 25 Javascript
JavaScript组件开发完整示例
Dec 15 Javascript
JS类的定义与使用方法深入探索
Nov 26 Javascript
js通过指定下标或指定元素进行删除数组的实例
Jan 12 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
Feb 08 Javascript
浅谈javascript的url参数parse和build函数
Mar 04 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
Dec 07 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
Apr 23 Javascript
如何在Vue.JS中使用图标组件
Aug 04 Javascript
提交表单时执行func方法实现代码
Mar 17 #Javascript
javascript中this做事件参数相关问题解答
Mar 17 #Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
Mar 17 #Javascript
Javascript跨域请求的4种解决方式
Mar 17 #Javascript
两种方法实现文本框输入内容提示消失
Mar 17 #Javascript
js 自制滚动条的小例子
Mar 16 #Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
Mar 15 #Javascript
You might like
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
JavaScript与Div对层定位和移动获得坐标的实现代码
2010/09/08 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
2017/07/26 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
python使用scrapy解析js示例
2014/01/23 Python
python使用any判断一个对象是否为空的方法
2014/11/19 Python
在Django的URLconf中使用命名组的方法
2015/07/18 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
python3 sorted 如何实现自定义排序标准
2020/03/12 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
英国50岁以上人群的交友网站:Ourtime
2018/03/28 全球购物
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
个人综合鉴定材料
2014/05/23 职场文书
学雷锋标语
2014/06/25 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
2015年副班长工作总结
2015/05/15 职场文书
赢在执行观后感
2015/06/16 职场文书
HTML+CSS实现导航条下拉菜单的示例代码
2021/08/02 HTML / CSS