2016-01-27 19 views
6

說我有一些因素我想動畫:jQuery的鏈接與回調的動畫功能

$('.hey').show(1000).slideUp(1000); 

這是什麼之間的區別:在什麼內部發生方面

$('.hey').show(1000, function() { 
    $(this).slideUp(1000); 
}); 

?據我所知,動畫在jQuery中是異步的。因此,第一個示例showslideUp應該同時觸發。在第二個,slideUp只應在show結束後纔會觸發。

然而,由於某種原因,像on this answer這樣的人說他們是「相同的」。爲什麼它們是相同的,儘管它們的工作方式不同(在第一個例子中,回報將立即發生,與第二個例子不同)?

+1

在JavaScript中,任何情況下,return都會立即返回(''無限無盡的while循環') – Rayon

+1

@Satpal'show(duration)'也使用fx隊列,只是沒有任何參數傳遞給show()是同步 –

回答

5

然而,由於某種原因,喜歡這個答案的人說他們是「相同的」。

你說得對,他們不是。如果不止一個元素匹配.hey,那麼它們之間會有特別大的差異。但是用你所引用的代碼,雖然他們所採取的步驟順序是不同的,但他們最終會以做同樣的事情。

儘管(顯而易見)他們的工作不同(第一個例子中,返回將立即發生,與第二個不同),但它們爲什麼相同?

在這兩個例子中,代碼立即運行並完成(「返回」)。

在第一個示例中,slideUp的調用立即發生,但 jQuery通過將slideUp動畫添加到動畫隊列的末尾並返回來處理該調用;實際的slideUp會在稍後到達動畫隊列時發生。

在第二個示例中,立即調用show,然後在動畫完成後,完成對slideUp的調用。

當多個元素的選擇相匹配的主要區別是,在你的第一個例子,有一個呼叫slideUp,它增加了效果基本show操作動畫隊列當前設定的jQuery對象中的元素,你叫它在。在第二個中,有多個調用完成回調,每個元素完成時一個。

另外一個很重要的區別是由Arun P Johnythe comments強調:如果您要添加另一個動畫功能,這些相同的元素以後,它會的slideUp後加入到隊列第一個例子,但在第二個例子slideUp就是之後那個其他的動畫。

但是,帶着你所引用的代碼,當他們走上不同的道路時,他們最終會做同樣的事情。

+3

我認爲還有另一個區別是假設有另一個事件處理程序,它將在演示動畫運行時執行,並且現在會添加另一個動畫,在這兩種情況下動畫更改的順序......在第一種情況下,新動畫將會發生在幻燈片後,但在第二次它會發生之前 - 只是將它添加爲答案 –

+0

@ArunPJohny:非常好的一點! –

+1

可能你可以將它添加到你的答案... –