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 相关文章推荐
javascript面向对象之访问对象属性的两种方式分析
Jan 13 Javascript
调试JavaScript中正则表达式中遇到的问题
Jan 27 Javascript
asp.net中oracle 存储过程(图文)
Aug 12 Javascript
Vue.js基础知识汇总
Apr 27 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
Mar 25 Javascript
详解vue2父组件传递props异步数据到子组件的问题
Jun 29 Javascript
angular框架实现全选与单选chekbox的自定义
Jul 06 Javascript
js表单序列化判断空值的实例
Sep 22 Javascript
浅谈Vue Element中Select下拉框选取值的问题
Mar 01 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
Jun 12 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
Jun 28 Javascript
vue-router+nginx 非根路径配置方法
Jun 30 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 JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
PHP模块memcached使用指南
2014/12/08 PHP
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
js登录弹出层特效
2014/03/07 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
2016/06/17 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
在js中实现邮箱格式的验证方法(推荐)
2016/10/24 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
vue init失败简单解决方法(终极版)
2017/12/22 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
django2 快速安装指南分享
2018/01/05 Python
python实现两个文件合并功能
2018/04/01 Python
python list删除元素时要注意的坑点分享
2018/04/18 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
外企测试工程师面试题
2015/02/01 面试题
同学会邀请书大全
2014/01/12 职场文书
上课迟到检讨书
2014/02/19 职场文书
外贸员简历中的自我评价
2014/03/04 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
新学期主题班会
2015/08/17 职场文书
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP