利用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 相关文章推荐
如何让动态插入的javascript脚本代码跑起来。
Jan 09 Javascript
用cookies实现的可记忆的样式切换效果代码下载
Dec 24 Javascript
Javascript 面试题随笔
Mar 31 Javascript
jquery js 重置表单 reset()具体实现代码
Aug 05 Javascript
收集json解析的四种方法分享
Jan 17 Javascript
jQuery scroll事件实现监控滚动条分页示例
Apr 04 Javascript
jquery利用命名空间移除绑定事件的方法
Mar 11 Javascript
基于Vue.js实现tab滑块效果
Jul 23 Javascript
微信小程序-API接口安全详解
Jul 16 Javascript
关于Vue中$refs的探索浅析
Nov 05 Javascript
比较node.js和Deno
Apr 27 Javascript
详解Js模块化的作用原理和方案
Apr 29 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
FCKeditor添加自定义按钮
2008/03/27 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
PHP 8新特性简介
2020/08/18 PHP
JavaScript 密码强度判断代码
2009/09/05 Javascript
Javascript表达式中连续的 &amp;&amp; 和 || 之赋值区别
2010/10/17 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
2016/02/28 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
vant实现购物车功能
2020/06/29 Javascript
[14:57]DOTA2 HEROS教学视频教你分分钟做大人-幽鬼
2014/06/13 DOTA
Python的re模块正则表达式操作
2016/05/25 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
浅析python实现动态规划背包问题
2020/12/31 Python
Dr. Martens马汀博士德国官网:马丁靴鼻祖
2019/12/26 全球购物
北京振戎融通Java面试题
2015/09/03 面试题
应届大专毕业生个人自荐信
2013/09/22 职场文书
军训生自我鉴定范文
2013/12/27 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
四风自我剖析材料
2014/09/30 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
加强作风建设心得体会
2014/10/22 职场文书
上课说话检讨书
2015/01/27 职场文书
财务个人年度总结范文
2015/02/26 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书