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 相关文章推荐
父窗口获取弹出子窗口文本框的值
Jun 27 Javascript
Apply an AutoFormat to an Excel Spreadsheet
Jun 12 Javascript
JavaScript学习笔记(十)
Jan 17 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
May 11 Javascript
JavaScript实现Java中StringBuffer的方法
Feb 09 Javascript
JQuery中$.each 和$(selector).each()的区别详解
Mar 13 Javascript
js实现人民币大写金额形式转换
Apr 27 Javascript
纯JS代码实现气泡效果
May 04 Javascript
浅谈jquery中使用canvas的问题
Oct 10 Javascript
BootStrap实现文件上传并带有进度条效果
Sep 11 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
Mar 22 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
Apr 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中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
CodeIgniter框架常见用法工作总结
2017/03/16 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
jQuery之折叠面板的深入解析
2013/06/19 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
jQuery插件简单实现方法
2015/07/18 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
Python中实现的RC4算法
2015/02/14 Python
Python的randrange()方法使用教程
2015/05/15 Python
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
python 使用raw socket进行TCP SYN扫描实例
2020/05/05 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
新闻人物通讯稿
2014/10/09 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫
方法汇总:Python 安装第三方库常用
2022/04/26 Python