2013-02-27 41 views
9

有沒有,如果我做任何區別:如何確定使用哪一個 - next();或出列();?

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

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

他們做同樣的事情?

有什麼區別,應該使用哪些?

這很奇怪的原因jQuery的文檔並沒有真正提.next(),他們總是說使用.dequeue(),但我的職場人使用.next()功能,所以這讓我相當困惑。

+0

這是一個[tag:optimization]問題? – millimoose 2013-02-27 01:39:35

+0

在['.queue()'](http://api.jquery.com/queue/#queue2)的文檔中記錄了'next()'的作用:「從jQuery 1.4開始,函數是被調用的是另一個函數作爲第一個參數,當被調用時,這會自動將下一個項目出隊並保持隊列移動。 – millimoose 2013-02-27 01:41:28

+0

我添加了優化,因爲它聲明優化是改進方法或設計的行爲。我正在尋找使用這些功能的最佳方法,所以我正在尋找'優化'我的代碼......讓我百分百感覺! – Epik 2013-02-27 02:47:36

回答

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é我小的討論中,實際上可以不使用標準fx隊列時是next()$(this).dequeue()之間在功能上的差異,具體。當創建next函數時,它被設置爲調用$.dequeue,其類型已從queue中獲取,但$.fn.dequeue將該類型作爲參數。這可能是更堅持next()的動力,儘管我從來沒有看到有人使用除標準效果隊列之外的其他任何東西。

+0

很好解釋謝謝。如果按照您的方式進行佈置,現在纔有意義。 – Epik 2013-02-27 02:51:10

+0

+1爲非'fx'隊列的捕獲,編輯我的答案以及遵守這一點。 '=]' – 2013-02-27 03:22:07

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丸在評論指出,有與非fx隊列打交道時,還多了一個特點:

$(this).dequeue()沒有type參數將出列默認隊列(fx)所以非fx隊列需要將名稱作爲參數傳遞給.dequeue(),而.next()查找其創建範圍的鏈並自動檢索$.dequeue()範圍內的type,該範圍創建了t他next函數對象。

因此,使用非fx隊列時,你將不得不隊列名稱傳遞給$().dequeue(queueIdentifier),而.next()將永遠在你的回調屬於隊列中出列。

+0

我正要編輯我的回答,以評論'$ .fn.dequeue'將'type'作爲參數,而'next'則使用從'queue'綁定中獲取的'type'來定義。這意味着'$(this).dequeue'顯然不適用於沒有額外參數的非'fx'隊列,而'next()'會。這聽起來對嗎? – 2013-02-27 02:54:11

+0

@ExplosionPills是的,絕對。 ''(this).dequeue()'如果沒有'type'參數將會使默認隊列('fx')出隊,所以非'fx'隊列需要隊列名作爲參數傳遞,而'.next()'「繼承「先前傳入的'類型'。不錯的地方。 '=]' – 2013-02-27 03:06:13

相關問題