利用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上传插件 uploadify v3.1使用说明
Jun 18 Javascript
jquery教程ajax请求json数据示例
Jan 13 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
Apr 04 Javascript
java、javascript实现附件下载示例
Aug 14 Javascript
Javascript Objects详解
Sep 04 Javascript
使用jquery解析XML的方法
Sep 05 Javascript
JavaScript-html标题滚动效果的简单实现
Sep 08 Javascript
JavaScript框架Angular和React深度对比
Nov 20 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
Dec 06 Javascript
浅谈React 服务器端渲染的使用
May 08 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
Apr 10 Javascript
JavaScript实现商品评价五星好评
Nov 30 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 socke 向指定页面提交数据
2008/07/23 PHP
允许phpmyadmin空密码登录的配置方法
2011/05/29 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
解决vue点击控制单个样式的问题
2018/09/05 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
vue等两个接口都返回结果再执行下一步的实例
2020/09/08 Javascript
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
python 怎样进行内存管理
2020/11/10 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
2013年入党人员的自我鉴定
2013/10/25 职场文书
计算机网络专业推荐信
2013/11/24 职场文书
大学生职业生涯规划书模版
2013/12/30 职场文书
设计师个人求职信范文
2014/02/02 职场文书
公司晚会主持词
2014/03/22 职场文书
保密承诺书范文
2014/03/27 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
2015年考研复习计划
2015/01/19 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
Django drf请求模块源码解析
2021/06/08 Python
SQL Server删除表中的重复数据
2022/05/25 SQL Server