2010-03-03 85 views
7

...或者更具體地說,他們如何能夠通過JavaScript創建動畫,這是同步的,而不需要保留下一個javascript語句。jQuery如何完成其​​異步動畫?

這只是一種好奇心。他們是否使用鏈條setTimeout()?如果是這樣,他們是否提前設置,每個人的持續時間比以前稍長一些,並行運行?或者它們是通過遞歸函數調用創建的,因此可以串行運行?

或者是完全不同的東西?

回答

6

setTimeout()的一個替代方法叫做setInterval(),它會定期調用你作爲參數傳遞的函數。調用setInterval將返回一個可傳遞給clearInterval的值,以停止調用該函數。

+0

好的。我沒有考慮過'setInterval()'。所以如果我創建一個持續時間爲1000的動畫,jQuery中'setInterval()'的持續時間被設置爲1,並且在1000次調用之後被清除。或類似的東西? – user113716 2010-03-03 13:30:35

+1

@patrick yes是這樣的 - 間隔時間可能比1ms長一點,我認爲IE的最小間隔大約是15ms左右。 (不記得這是否意味着它舍入到0ms或四捨五入到15ms :-) – Pointy 2010-03-03 13:32:27

+0

因此,我想他們做了一些數學,將持續時間除以最小的毫秒數,可能再次除以動畫的「距離」並且每個函數調用移動目標元素1px。這聽起來很接近嗎? – user113716 2010-03-03 13:38:24

6

使用jQuery 1.4.2上線5534 - 5536:

if (t() && jQuery.timers.push(t) && !timerId) { 
    timerId = setInterval(jQuery.fx.tick, 13); 
} 

通知的setInterval爲jQuery的tick方法觸發在動畫的步驟。

1

對setTimeout的鏈接調用並非真正的「遞歸」。如果一個setTimeout函數在被調用時設置了另一個自身作爲處理程序的超時值,那麼到新超時發生時,原始調用將會消失。

使用setTimeout而不是setInterval對我來說通常更靈活,因爲它可以讓定時代碼自適應(也可能取消)。一般模式是在setTimout調用周圍設置一個閉包,以便定時過程(動畫,如果這就是您正在做的)所需的數據可用並與應用程序的其餘部分隔離。然後在初始運行時啓動超時。

在超時處理程序內部,可以使用「arguments.callee」來引用自身,併爲後續「幀」重置超時。