利用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实现程序暂停与继续功能代码解读
Oct 10 Javascript
js判断当前浏览器类型,判断IE浏览器方法
Jun 02 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
Mar 03 Javascript
jQuery插件实现大图全屏图片相册
Mar 14 Javascript
基于jquery实现轮播焦点图插件
Mar 31 Javascript
AngularJS指令中的绑定策略实例分析
Dec 14 Javascript
Bootstrap CSS组件之输入框组
Dec 17 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
Jun 26 Javascript
vue中使用echarts制作圆环图的实例代码
Jul 27 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
May 10 Javascript
Vue+Element-UI实现上传图片并压缩
Nov 26 Javascript
js String.prototype.trim字符去前后空格的扩展
Aug 23 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语言认识上需要避免的10大误区
2014/06/12 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
ExtJs的Date格式字符代码
2010/12/30 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
javascript中字符串拼接详解
2014/09/26 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
JavaScript分页功能的实现方法
2015/04/25 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
ES6新特性之Symbol类型用法分析
2017/03/31 Javascript
EL表达式截取字符串的函数说明
2017/09/22 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
[01:09:13]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第三场 1月19日
2021/03/11 DOTA
python统计文本文件内单词数量的方法
2015/05/30 Python
python插入排序算法实例分析
2015/07/03 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
python实现停车管理系统
2018/11/30 Python
python opencv实现gif图片分解的示例代码
2019/12/13 Python
python模拟斗地主发牌
2020/04/22 Python
python中os包的用法
2020/06/01 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
某科技软件测试面试题
2013/05/19 面试题
机械制造专业个人的自我评价
2013/12/28 职场文书
幼儿园教师请假制度
2014/01/16 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年关工委工作总结
2014/11/17 职场文书
2015秋季幼儿园开学寄语
2015/03/25 职场文书
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python