jQuery 源码分析笔记(7) Queue


Posted in Javascript onJune 19, 2011

每个Element可以拥有多个队列,但是基本上都只使用到一个,即默认的fn队列。队列允许一系列函数被异步地调用而不会阻塞程序。例如:$("#foo").slideUp().fadeIn();其实这个就是我们大家常用的链式调用,实际上这是一个Queue。所以队列和Deferred地位类似,是一个内部使用的基础设施。当slideUp运行时,fadeIn被放到fx队列中,当slideUp完成后,从队列中被取出运行。queue函数允许直接操作这个链式调用的行为。同时,queue可以指定队列名称获得其他能力,而不局限于fx队列。

// 一般用法: 
$("#foo").slideUp(function() { 
alert("Animation complete."); 
}); 
// 相当于: 
$("#foo").slideUp(); // 不提供回调,只是触发事件 
$("#foo").queue(function() { // 把回调函数加入 
alert("Animation complete."); 
$(this).dequeue(); // 必须从队列中取出,那么队列中的下一个函数就有机会被调用 
});

queue内部使用data或者JavaScript数组API来保存数据。其中操作数组的push和shift天生就是一组队列API。而data可以用来保存任意数据。
queue: function(elem, type, data) { 
if(elem) { 
// 默认是fn 
type = (type || "fx") + "queue"; 
// data内部API:data(element, key, value, pvt); 
// 这里不传入data,是为了效率的考虑。如果没传入data,则只是get队列,那么就不需要以下的判断了 
var q = jQuery.data(elem, type, undefined, true); 
if(data) { 
if(!q || jQuery.isArray(data)) { 
q = jQuery.data(elem, type, jQuery.makeArray(data), true); 
} else { 
q.push(data); // 压入 
} 
} 
return q || []; 
} 
} 
dequeue: function(elem, type) { type = type || "fx"; // 得到这个队列 var queue = jQuery.queue(elem, type), // 出列一个元素 fn = queue.shift(), defer; 
// "inprogress"岗哨 
if(fn === "inprogress") { 
fn = queue.shift(); 
} 
if(fn) { 
// 加一个岗哨,防止自动出列 
if(type === "fx") { 
queue.unshift("inprogress"); 
} 
// 执行 
fn.call(elem, function() { 
jQuery.dequeue(elem, type); 
}); 
} 
if(!queue.length) { 
jQuery.removeData(elem, type + "queue", true); 
handleQueueMarkDefer(elem, type, "queue"); 
} 
}
Javascript 相关文章推荐
firefox浏览器下javascript 拖动层效果与原理分析代码
Dec 04 Javascript
jQuery新闻滚动插件 jquery.roller.js
Jun 27 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
Jan 29 Javascript
jQuery避免$符和其他JS库冲突的方法对比
Feb 20 Javascript
javascript实现滑动解锁功能
Dec 31 Javascript
javascript随机显示背景图片的方法
Jun 18 Javascript
给before和after伪元素设置js效果的方法
Dec 04 Javascript
javascript每日必学之封装
Feb 23 Javascript
深入浅析Vue.js中 computed和methods不同机制
Mar 22 Javascript
axios的拦截请求与响应方法
Aug 11 Javascript
JS原生带缩略图的图片切换效果
Oct 10 Javascript
微信小程序实现授权登录
May 15 Javascript
jQuery 源码分析笔记(5) jQuery.support
Jun 19 #Javascript
jQuery调用WebService的实现代码
Jun 19 #Javascript
非常棒的10款jQuery 幻灯片插件
Jun 14 #Javascript
在jquery中处理带有命名空间的XML数据
Jun 13 #Javascript
jquery 与NVelocity 产生冲突的解决方法
Jun 13 #Javascript
用Juery网页选项卡实现代码
Jun 13 #Javascript
读jQuery之三(构建选择器)
Jun 11 #Javascript
You might like
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
初始Nodejs
2014/11/08 NodeJs
jquery中filter方法用法实例分析
2015/02/06 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
利用JQuery直接调用asp.net后台的简单方法
2016/10/27 Javascript
js实现返回顶部效果
2017/03/10 Javascript
Webpack打包慢问题的完美解决方法
2017/03/16 Javascript
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
Python之修改图片像素值的方法
2019/07/03 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
学前班教师的自我鉴定
2013/12/05 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
应聘护士求职信
2014/07/21 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
解放思想演讲稿
2014/09/11 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫