利用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 相关文章推荐
jquery.pagination.js 无刷新分页实现步骤分享
May 23 Javascript
javascript中有趣的反柯里化深入分析
Dec 05 Javascript
jquery操作复选框checkbox的方法汇总
Feb 05 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
Aug 27 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
Jan 21 Javascript
Winform客户端向web地址传参接收参数的方法
May 17 Javascript
js 定义对象数组(结合)多维数组方法
Jul 27 Javascript
Javascript基础回顾之(一) 类型
Jan 31 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
Jul 09 Javascript
关于vue.js组件数据流的问题
Jul 26 Javascript
从vue源码解析Vue.set()和this.$set()
Aug 30 Javascript
微信小程序绑定手机号获取验证码功能
Oct 22 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中的一个中文字符串截取函数
2007/02/14 PHP
php下载远程文件类(支持断点续传)
2008/11/14 PHP
PHP优于Node.js的五大理由分享
2012/09/15 PHP
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
2014/07/18 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
详谈JavaScript的闭包及应用
2017/01/17 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
2017/03/01 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
python批量生成本地ip地址的方法
2015/03/23 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
python 类之间的参数传递方式
2019/12/20 Python
Python识别验证码的实现示例
2020/09/30 Python
英国骑行、跑步、游泳、铁人三项运动装备专卖店:Wiggle
2016/08/23 全球购物
精选奢华:THE LIST
2019/09/05 全球购物
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
好邻里事迹材料
2014/01/16 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
大学生读书笔记大全
2015/07/01 职场文书
详解Nginx 工作原理
2021/03/31 Servers
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技