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 相关文章推荐
IE下js调试工具Companion.JS
Oct 15 Javascript
分享27个jQuery 表单插件集合推荐
Apr 25 Javascript
图片上传判断及预览脚本的效果实例
Aug 07 Javascript
javascript刷新父页面的各种方法汇总
Sep 03 Javascript
js实现文本框选中的方法
May 26 Javascript
javascript 用函数实现继承详解
May 28 Javascript
简单理解vue中el、template、replace元素
Oct 27 Javascript
AngularJS中isolate scope的用法分析
Nov 22 Javascript
详解jQuery停止动画——stop()方法的使用
Dec 14 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
Aug 31 Javascript
用vue-cli开发vue时的代理设置方法
Sep 20 Javascript
vue excel上传预览和table内容下载到excel文件中
Dec 10 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 array_map()数组函数使用说明
2011/07/12 PHP
深入解析PHP内存管理之谁动了我的内存
2013/06/20 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
2017/06/10 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
2019/05/09 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
js实现简单计算器
2015/11/22 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
解决vue项目router切换太慢问题
2020/07/19 Javascript
Python标准库之Sys模块使用详解
2015/05/23 Python
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
获取Django项目的全部url方法详解
2017/10/26 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
python Matplotlib模块的使用
2020/09/16 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
团队精神口号
2014/06/06 职场文书
小学生通知书评语
2014/12/31 职场文书
因家庭原因离职的辞职信范文
2015/05/12 职场文书
创业计划书之网吧
2019/10/10 职场文书
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技