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 相关文章推荐
js验证表单第二部分
Nov 25 Javascript
理解 JavaScript 预解析
Oct 25 Javascript
ajax 缓存 问题 requestheader
Aug 01 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
Oct 21 Javascript
Node.js 条形码识别程序构建思路详解
Feb 14 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
Mar 05 Javascript
jQuery居中元素scrollleft计算方法示例
Jan 16 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
Jan 09 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
Jun 12 jQuery
ionic+html5+API实现双击返回键退出应用
Sep 17 Javascript
layui清除radio的选中状态实例
Nov 14 Javascript
vue-cli创建的项目中的gitHooks原理解析
Feb 14 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.MVC的模板标签系统(一)
2006/09/05 PHP
输出控制类
2006/10/09 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
Yii框架函数简单用法分析
2019/09/09 PHP
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
百度地图api如何使用
2015/08/03 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
python实现井字棋游戏
2020/03/30 Python
python实现汉诺塔算法
2021/03/01 Python
python实现QQ空间自动点赞功能
2019/04/09 Python
python如何代码集体右移
2020/07/20 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
2017/03/02 HTML / CSS
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
三个Unix的命令面试题
2015/04/12 面试题
制衣厂各岗位职责
2013/12/02 职场文书
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
王老吉广告词
2014/03/20 职场文书
社区交通安全实施方案
2014/03/22 职场文书
3分钟演讲稿
2014/04/30 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
三八活动策划方案
2014/08/17 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
师德师风剖析材料
2014/09/30 职场文书
父亲节寄语大全
2015/02/27 职场文书
领导干部失职检讨书
2015/05/05 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
关于MySQL中的 like操作符详情
2021/11/17 MySQL
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
JAVA springCloud项目搭建流程
2022/05/11 Java/Android