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 数组克隆方法 小结
Mar 20 Javascript
jquery.cookie.js使用指南
Jan 05 Javascript
全面解析bootstrap格子布局
May 22 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
Aug 02 Javascript
Vue2.0实现组件数据的双向绑定问题
Mar 06 Javascript
Vue.js 踩坑记之双向绑定
May 03 Javascript
Element-UI中Upload上传文件前端缓存处理示例
Feb 21 Javascript
angular 实现同步验证器跨字段验证的方法
Apr 11 Javascript
jQuery - AJAX load() 实例用法详解
Aug 27 jQuery
js实现移动端tab切换时下划线滑动效果
Sep 08 Javascript
layui实现数据表格隐藏列的示例
Oct 25 Javascript
layui表格设计以及数据初始化详解
Oct 26 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通用检测函数集合
2006/11/25 PHP
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
PHP引用符&的用法详细解析
2013/08/22 PHP
php实现邮件发送并带有附件
2014/01/24 PHP
php防止sql注入简单分析
2015/03/18 PHP
IE与firefox之jquery用法区别
2008/10/03 Javascript
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
js 开发之autocomplete="off"在chrom中失效的解决办法
2017/09/28 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
2018/12/06 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
小程序实现搜索框
2020/06/19 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
python实现神经网络感知器算法
2017/12/20 Python
python3爬取数据至mysql的方法
2018/06/26 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
在django中,关于session的通用设置方法
2019/08/06 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
django之从html页面表单获取输入的数据实例
2020/03/16 Python
医学院校毕业生自荐信范文
2014/01/01 职场文书
KTV的创业计划书范文
2014/02/02 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
师德培训心得体会2016
2016/01/09 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python