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写的实用看图工具实现代码
Jul 26 Javascript
JavaScript中常见陷阱小结
Apr 27 Javascript
jquery $.each() 使用小探
Aug 23 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
Sep 04 Javascript
jquery1.9 下检测浏览器类型和版本的方法
Dec 26 Javascript
js利用数组length属性清空和截短数组的小例子
Jan 15 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
Dec 16 Javascript
node.js中的fs.createReadStream方法使用说明
Dec 17 Javascript
微信小程序自动客服功能
Nov 02 Javascript
详解webpack 最简打包结果分析
Feb 20 Javascript
vue基于viewer实现的图片查看器功能
Apr 12 Javascript
Angular.JS读取数据库数据调用完整实例
Jul 02 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/10/09 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
js代码实现微博导航栏
2015/07/30 PHP
利用PHP判断文件是否为图片的方法总结
2017/01/06 PHP
php 数据结构之链表队列
2017/10/17 PHP
关于laravel 子查询 & join的使用
2019/10/16 PHP
JQuery 弹出框定位实现方法
2010/12/02 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
vue v-model的用法解析
2020/10/19 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
Python之变量类型和if判断方式
2020/05/05 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
python 图像增强算法实现详解
2021/01/24 Python
详解移动端Html5页面中1px边框的几种解决方法
2018/07/24 HTML / CSS
介绍一下你对SOA的认识
2016/04/24 面试题
大专生毕业的自我评价
2014/02/06 职场文书
村级个人对照检查材料
2014/08/22 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
神秘岛读书笔记
2015/07/01 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python