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 相关文章推荐
Javascript执行效率全面总结
Nov 04 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
Jun 30 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
JS组件Bootstrap Table布局详解
May 27 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
Aug 01 Javascript
jQuery插件ajaxFileUpload使用实例解析
Oct 19 Javascript
Three.js的使用及绘制基础3D图形详解
Apr 27 Javascript
vue利用axios来完成数据的交互
Mar 23 Javascript
Vue验证码60秒倒计时功能简单实例代码
Jun 22 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
Aug 09 Javascript
vue-cli3环境变量与分环境打包的方法示例
Feb 18 Javascript
详解小程序循环require之坑
Mar 08 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
PHP魔术方法的使用示例
2015/06/23 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
js无刷新操作table的行和列
2014/03/27 Javascript
javascript如何使用bind指定接收者
2014/05/04 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
果断收藏9个Javascript代码高亮脚本
2016/01/06 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
关于RequireJS的简单介绍即使用方法
2016/10/20 Javascript
Angular2中如何使用ngx-translate进行国际化
2017/05/21 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
2019/06/05 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
python中ConfigParse模块的用法
2014/09/29 Python
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
Python封装shell命令实例分析
2015/05/05 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
python reduce 函数使用详解
2017/12/05 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
促销活动策划方案
2014/01/12 职场文书
商务英语专业毕业生求职信
2014/07/06 职场文书
中国梦读书活动总结
2014/07/10 职场文书
Python实现生成bmp图像的方法
2021/06/13 Python
浅谈redis整数集为什么不能降级
2021/07/25 Redis
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA