2011-04-20 117 views
2

我試圖理解當我把多個調用放在jQuery上時,它意味着什麼,因爲我沒有得到我期望的類似情況下的結果。jQuery函數隊列混淆

例1:

$(this).animate({opacity: 0.25}, 250).animate({opacity: 1.0}, 250); 

正如預期的那樣,這給了半透明的快閃返回到完全不透明瞭。

例2:

$(this).animate({opacity: 0.25}, 250).removeAttr("style"); 

在這種情況下,而不是逐漸恢復到不透明,我預計removeAttr(「風格」),以使其跳回不透明度動畫完成後。這是因爲動畫不透明度函數僅僅更改了opacity的值並設置了display:block,我期望通過刪除這些樣式,一切都恢復正常。

相反,它看起來像removeAttr在動畫完成前觸發,清除樣式,然後動畫設置更多的不透明度,使項目保持半透明。

事實上,這是事件發生的順序似乎的事實,改變removeAttr使用完成回調確認工作正常:

$(this).animate({opacity: 0.25}, 250, function(){$(this).removeAttr("style");}); 

爲什麼是它的動畫似乎要處理串行,而至少有一些功能與動畫並行處理?

回答

3

這裏有兩種不同的隊列。

當您撥打animate時,會將其推送到名爲fx的效果隊列中。大多數其他事情不使用隊列。這就是爲什麼這兩個電話似乎同時發生。

+1

+1,但大多數其他函數(如removeAttr())甚至不使用隊列,而是立即應用它們的效果。 – 2011-04-20 00:29:06

+0

@ Box9:我只是想編輯我的答案:),在與jsFiddle玩了一段時間之後:http://jsfiddle.net/QVXEC/ – 2011-04-20 00:31:24

+0

通過在調用'animate'時將'queue'更改爲'false' ,它應該立即執行而不等待'fx'隊列上的其他功能。它的確如此,但它並不完全同步執行,因爲人們會相信,因爲'removeAttr'也會立即觸發。 – 2011-04-20 00:32:49

2

您可以將animate視爲異步。

如果你想在之後發生動畫完成,那麼你應該使用回調函數。