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 相关文章推荐
ext form 表单提交数据的方法小结
Aug 08 Javascript
一些不错的js函数ajax
Aug 20 Javascript
再谈javascript图片预加载技术(详细演示)
Mar 12 Javascript
Function.prototype.bind用法示例
Sep 16 Javascript
JS实现的4种数字千位符格式化方法分享
Mar 02 Javascript
jQuery实现带玻璃流光质感的手风琴特效
Nov 20 Javascript
Jquery获取当前城市的天气信息
Aug 05 Javascript
JS for...in 遍历语句用法实例分析
Aug 24 Javascript
AngularJs Understanding the Model Component
Sep 02 Javascript
让微信小程序支持ES6中Promise特性的方法详解
Jun 13 Javascript
vue控制多行文字展开收起的实现示例
Oct 11 Javascript
vue实现移动端项目多行文本溢出省略
Jul 29 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中变量引用与变量销毁机制分析
2014/11/15 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
PHP7修改的函数
2021/03/09 PHP
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
利用jQuery对无序列表排序的简单方法
2016/10/16 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
jquery编写日期选择器
2017/03/16 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
python搭建简易服务器分析与实现
2012/12/15 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
python如何将两个txt文件内容合并
2019/10/18 Python
python中return如何写
2020/06/18 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
python中把元组转换为namedtuple方法
2020/12/09 Python
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
主要的Ajax框架都有什么
2013/11/14 面试题
车间工艺员岗位职责
2013/12/09 职场文书
会议接待欢迎词
2014/01/12 职场文书
幼师求职自荐信范文
2014/01/26 职场文书
施工材料员岗位职责
2014/02/12 职场文书
主题班会演讲稿
2014/05/22 职场文书
技术股份合作协议书
2014/10/05 职场文书
网站出售协议书范文
2014/10/10 职场文书
Python中文纠错的简单实现
2021/07/07 Python
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server