jQuery 源码分析笔记(7) Queue

每个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");
}
}

(0)

相关推荐

  • jQuery AjaxQueue改进步骤

    假期里没事就想着改进下,改得地方不多,主要有以下三点: complete回调在jquery1.5以后可以是一个函数数组,按数组顺序调用. 如果前一个请求未返回,新的请求发出,那么撤销前一个请求,也就是新的请求"覆盖"原请求. 写成面向对象的形式,再用一个AjaxManage进行简单的管理. 代码如下,详细可看注释: 复制代码 代码如下: ;(function($) { // override:新的请求是否要覆盖之前的请求 function AjaxQueue(override) { t

  • jQuery中队列queue()函数的实例教程

    如果当前jQuery对象匹配多个元素:获取队列时,只获取第一个匹配元素上的队列:设置队列(替换队列.追加函数)时,则为每个匹配元素都分别进行设置. 该函数属于jQuery对象(实例).如果需要移除并执行队列中的第一个函数,请使用dequeue()函数.你也可以使用clearQueue()函数清空指定的队列. 语法 jQuery 1.2 新增该函数.queue()函数具有如下两种用法: 用法一: jQueryObject.queue( [ queueName ] [, newQueue ] ) 如

  • jQuery队列控制方法详解queue()/dequeue()/clearQueue()

    先解释一下这组方法各自的含义. queue(name,[callback]): 当只传入一个参数时, 它返回并指向第一个匹配元素的队列(将是一个函数数组,队列名默认是fx); 当有两个参数传入时, 第一个参数还是默认为fx的的队列名, 第二个参数又分两种情况, 当第二个参数是一个函数时, 它将在匹配的元素的队列最后添加一个函数. 当第二个参数是一个函数数组时,它将匹配元素的队列用新的一个队列来代替(函数数组).可能, 这个理解起来有点晕, 稍后, 后面会有点此查看DEMO. dequeue(na

  • jQuery中queue()方法用法实例

    本文实例讲述了jQuery中queue()方法用法.分享给大家供大家参考.具体分析如下: 此方法能够显示或者操作在匹配元素上执行的函数队列. 此方法可能用的并不是太频繁,但是却非常的重要,下面就结合实例来介绍一下次方法的用法. 根据方法参数的不同,作用也有所不同. 说明:建议结合dequeue()函数一起学习. 语法结构一: 复制代码 代码如下: $("selector").queue(queueName) 参数列表: 参数 描述 queueName 可选. 第一个匹配元素上动画队列的

  • jQuery中clearQueue()方法用法实例

    本文实例讲述了jQuery中clearQueue()方法用法.分享给大家供大家参考.具体分析如下: 此方法能够清空对象上尚未执行的所有队列. 如果不带参数,则默认清空的是动画队列.这跟stop(true)类似,但stop()只能清空动画队列,而这个可以清空所有通过queue()创建的队列. 语法结构: 复制代码 代码如下: $(selector).clearQueue(queueName) 参数列表: 参数 描述 queueName 可选.定义要停止的队列的名称. 默认是 "fx",动

  • jQuery中dequeue()方法用法实例

    本文实例讲述了jQuery中dequeue()方法用法.分享给大家供大家参考.具体分析如下: 此函数能够从队列最前端移除一个队列函数,并执行它. 建议和queue()函数一起学习. 语法结构: 复制代码 代码如下: $(selector).dequeue(queueName) 参数列表: 参数 描述 queueName 可选.队列的名称. 默认是 "fx",动画队列. 实例代码: 复制代码 代码如下: <!DOCTYPE html> <html> <hea

  • jquery队列queue与原生模仿其实现方法分享

    queue() 方法显示或操作在匹配元素上执行的函数队列. queue和dequeue的过程主要是: 用queue把函数加入队列(通常是函数数组)用dequeue将函数数组中的第一个函数取出,并执行(用shift()方法取出并执行)也就意味着当再次执行dequeue的时候,得到的是另一个函数了.同时也意味着,如果不执行dequeue,那么队列中的下一个函数永远不会执行. 对于一个元素上执行animate方法加动画,jQuery内部也会将其加入名为 fx 的函数队列.而对于多个元素要依次执行动画,

  • jQuery 源码分析笔记(7) Queue

    每个Element可以拥有多个队列,但是基本上都只使用到一个,即默认的fn队列.队列允许一系列函数被异步地调用而不会阻塞程序.例如:$("#foo").slideUp().fadeIn();其实这个就是我们大家常用的链式调用,实际上这是一个Queue.所以队列和Deferred地位类似,是一个内部使用的基础设施.当slideUp运行时,fadeIn被放到fx队列中,当slideUp完成后,从队列中被取出运行.queue函数允许直接操作这个链式调用的行为.同时,queue可以指定队列名称

  • jQuery 源码分析笔记(5) jQuery.support

    其中jQuery.browser已经提供了根据UserAgent检测的浏览器信息.而jQuery.support 使用特性检测来检查浏览器的功能以及Bug. 和文档一样,首先说明一下,这个模块是很底层的代码,基本不需要在日常开发中使用,但是插件的开发者更需要.因为插件需要兼容各个浏览器.首先看一下 support模块提供了哪些浏览器特性的检测,以下结果是在Chrome 13 Dev下看到的结果.根据浏览器的不同,这里的成员可能会有变化.(PS:再次吐槽IE,大部分属性都是IE比较特别) ajax

  • jQuery 源码分析笔记(3) Deferred机制

    Deferred把回调函数注册到一个队列中,统一管理,并且可以同步或者异步地调用这些函数.jQuery.Deferred()用来构造一个Deferred对象.该对象有状态值,共有三种: Rejected, Resolved和初始状态.其中Resolved表示该操作成功完成了,而Rejected 则表示出现了错误,调用失败.Deferred对象的主要成员如下: done(callback): 注册一个callback函数,当状态为resolved时被调用. * fail(callback): 注册

  • jQuery 源码分析笔记(6) jQuery.data

    data部分的代码从1381行开始.最开始的几行关键代码: 复制代码 代码如下: jQuery.extend({ // 存储数据的地方,关键实现核心 cache: { }, // 分配ID用的seed uuid: 0, // 为了区别不同的jQuery实例存储的数据,使用前缀+jQuery版本号+随机数作为Key expando: "jQuery" + (jQuery.fn.jquery + Math.random()).replace(/\D/g, ""), //

  • jQuery 源码分析笔记(4) Ready函数

    这个功能在 jQuery的文档中提到了三种等价的形式: 复制代码 代码如下: // 定义在jQuery.fn.ready $(document).ready(handler); // 和上一个是同一个,不推荐 $().ready(handler); // 单独在jQuery对象中处理 $(handler); // 以上这个形式的定义: if(jQuery.isFunction(selector) { return rootjQuery.ready(selector); } 因此实际上都归结与一个

  • jQuery 源码分析笔记(2) 变量列表

    _jQuery = window.jQuery; _$ = window.$; 这两个变量是jQuery唯一使用的两个全局变量.在jQuery.noConflict()函数中,会把这两个变量恢复回去. 对于浏览器检测,jQuery使用的是检查UserAgent,而没有使用特性检测. rwebkit = /(webkit)[ \/]([\w.]+)/, ropera = /(opear)(?:.*version)?[ \/](\w+)/, rmsie = /(msie) ([\w.]+)/, rm

  • jQuery 源码分析笔记

    jQuery的宗旨是Write Less, Do More.它对JavaScript的开发风格侵入性不如YUI那么强,当然也不如Dojo和YUI如此庞大.它极大的简化了JavaScript的日常开发工作,主要是DOM元素的操作(从名字Query就可以看出).另外一个主要工作就是每个前端开发者都需要面对的浏览器兼容性.jQuery兼容所有主流浏览器的大部分版本,从万恶的IE6开始直到Firefox,Chrome等现代浏览器.除了居于核心的一小部分代码之外,剩下的jQuery都是松散的函数,扩展性很

  • jQuery源码分析-03构造jQuery对象-工具函数

    作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. 读读写写,不对的地方请告诉我,多多交流共同进步,本章的的PDF等本章写完了发布. jQuery源码分析系列的目录请查看 http://nuysoft.iteye.com/blog/1177451,想系统的好好写写,目前还是从我感兴趣的部分开始,如果大家有对哪个模块感兴趣的,建议优先分析的,可以告诉我,一起学习. 3.4 其他静态工具函数

  • jQuery源码分析之jQuery.fn.each与jQuery.each用法

    本文实例讲述了jQuery源码分析之jQuery.fn.each与jQuery.each用法.分享给大家供大家参考.具体分析如下: 先上例子,下面代码的作用是:对每个选中的div元素,都给它们添加一个red类 复制代码 代码如下: $('div').each(function(index, elem){       $(this).addClass('red'); } }); 上面用的的.each,即jQuery.fn.each,其内部是通过jQuery.each实现的 复制代码 代码如下: j

  • jQuery源码分析-01总体架构分析

    1. 总体架构 1.1 自调用匿名函数 self-invoking anonymous function 打开jQuery源码,首先你会看到这样的代码结构: 复制代码 代码如下: (function( window, undefined ) { // jquery code })(window); 1. 这是一个自调用匿名函数.什么东东呢?在第一个括号内,创建一个匿名函数:第二个括号,立即执行 2. 为什么要创建这样一个"自调用匿名函数"呢? 通过定义一个匿名函数,创建了一个"

随机推荐