如何确定使用什么 - next();或者出队();?

时间:2013-02-27 00:57:15

标签: javascript jquery optimization

如果我这样做有什么不同:

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

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

他们做同样的事吗?

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

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

2 个答案:

答案 0 :(得分: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,因为您可以将参数重命名为您想要的任何内容。

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

答案 1 :(得分: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只是为jQuery对象中包含的每个元素调用$.dequeue

您的使用案例$(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 Pills 所指出的,在处理非fx队列时还有一个特点:

不带$(this).dequeue()参数的

type将使默认队列(fx)出列,因此非fx队列要求将名称作为参数传递给{{1} } {,.dequeue()寻找其创建范围的链,并自动检索创建.next()函数对象的type范围内的$.dequeue()

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