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 相关文章推荐
File文件控件,选中文件(图片,flash,视频)即立即预览显示
Apr 09 Javascript
13个绚丽的Jquery 界面设计网站推荐
Sep 28 Javascript
jQuery循环滚动展示代码 可应用到文字和图片上
May 11 Javascript
js jquery获取随机生成id的服务器控件的三种方法
Jul 11 Javascript
深入探密Javascript数组方法
Jan 08 Javascript
JS使用eval解析JSON的注意事项分析
Nov 14 Javascript
AngularJS入门教程之Select(选择框)详解
Jul 27 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
Aug 05 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
Sep 28 Javascript
JavaScript监听手机物理返回键的两种解决方法
Aug 14 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
Nov 28 Javascript
js实现纯前端压缩图片
Nov 16 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
jquery中实现标签切换效果的代码
2011/03/01 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
关于JavaScript中事件绑定的方法总结
2016/10/26 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
JavaScript简单拖拽效果(1)
2017/05/17 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
[48:54]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第二场 6.3
2018/06/04 DOTA
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python getopt 参数处理小示例
2009/06/09 Python
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
Python实现比较两个列表(list)范围
2015/06/12 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
解决matplotlib库show()方法不显示图片的问题
2018/05/24 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
什么是.net
2015/08/03 面试题
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
新郎婚宴答谢词
2014/01/19 职场文书
公务员综合考察材料
2014/02/01 职场文书
竞选团支书演讲稿
2014/04/28 职场文书
电子专业求职信
2014/06/19 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
2015年女职工工作总结
2015/05/15 职场文书
开学第一天的感想
2015/08/10 职场文书
Python自动化实战之接口请求的实现
2022/05/30 Python