9

如果我这样做有什么区别:

$queue.queue(function(next){
   //...
   next();
}).queue(function(next){
   //...
   next();
});

相对

$queue.queue(function(){
   //...
   $(this).dequeue();
}).queue(function(){
   //...
   $(this).dequeue();
});

他们做同样的事情吗?

有什么区别,我应该使用哪个?

这很奇怪,因为 jQuery 文档并没有真正提到.next(),他们总是说要使用.dequeue(),但在我的工作场所人们使用该.next()功能,所以这让我很困惑。

4

2 回答 2

7

据我所知,没有区别。我不确定为什么一个比另一个更可取,或者为什么提到它们,因为这让我感到困惑。

查看http://code.jquery.com/jquery-1.9.1.js我们看到:

1915 next = function() {
         jQuery.dequeue( elem, type );
     };

...在jQuery.dequeue方法中。稍后(在第 1936 行)将其称为fn.call(elem, next, hooks). 您会看到这nextqueue回调中的第一个参数,并且fnqueue在那个时候。

展望未来,我们看到

1983 dequeue: function( type ) {
         return this.each(function() {
             jQuery.dequeue( this, type );
         });
     },

这是在 上定义的jQuery.fn,所以这是由 调用的函数$(this).dequeue。但是,这完全一样。唯一的区别是出队的元素。它在fn.dequeue集合中循环,但这只是$(this).

如果我们回头看,我们会看到elem

1908 dequeue: function( elem, type ) {

...嘿,等一下 .. 它是this(从 调用时$(this).dequeue)!因此,您可以看到它们做的事情完全相同。 $("some other collection").dequeue不过,工作方式会有所不同。

通话next()可以为您节省一个额外的.each电话,所以我想这会更快。

顺便说一句,您不必next在回调中调用它,因为您可以将参数重命名为您想要的任何名称。

next()编辑:根据我与杰出同事@FabrícioMatté 的小型讨论,实际上和之间的功能可能存在差异$(this).dequeue(),特别是在不使用标准fx队列时。创建next函数时,它被设置为$.dequeue使用从queue已经获取的类型调用,但$.fn.dequeue将类型作为参数。这可能是坚持使用的更多动力next(),尽管我实际上从未见过有人实际使用标准效果队列以外的任何东西。

于 2013-02-27T01:06:59.887 回答
4

两者jQuery.fn.dequeuenext函数都是简单的包装器jQuery.dequeue,在两个示例中传递相同的参数集。


(截至 jQuery 1.9.1 是最新的)

对于下一个函数参数:type是一个可选参数,表示队列,默认fx是jQuery的默认动画队列。element是一个 DOM 元素引用。

$.fn.dequeue

dequeue: function( type ) {
    return this.each(function() {
        jQuery.dequeue( this, type );
    });
}

$().dequeue只需调用$.dequeue包含在 jQuery 对象中的每个元素。

您的用例$(this).dequeue()将使用最初引用的元素调用$.dequeue一次this

类似地,next将传递一个对 的元素引用$.dequeue,它是队列出队的当前元素:

next = function() {
    jQuery.dequeue( elem, type );
};

换句话说,这些本质上是相同的。next更直接一点,因为它没有迭代包装器,因此next()应该比$.fn.dequeue().

主要区别在于您可以调用.dequeue()多个元素,它将使每个元素出队,而next()直接与队列出队的元素相关联。

对于$(this).dequeue()回调内部的用例,这是无关紧要的。$.fn.dequeue在开始使一个或多个元素出队时很有用。$(this).dequeue()具有与 等效的结果next(),但在这种情况下,后者将提供微秒的增益。


正如@Explosion Pillsfx在评论中指出的那样,在处理非队列时还有一个特殊之处:

$(this).dequeue()没有type参数将使默认队列(fx)出队,因此非fx队列需要将名称作为参数传递给.dequeue(),同时.next()查找其创建范围的链并自动检索创建函数对象type的范围内。$.dequeue()next

因此,当使用非fx队列时,您必须将队列名称传递给$().dequeue(queueIdentifier),而.next()始终在回调所属的队列中出列。

于 2013-02-27T01:04:06.153 回答