2011-12-17 31 views
0

假設我已經戒了一串用jQuery的動畫。我如何通過這些動畫來加速測試其副作用而無需等待?如何加速所有jquery動畫?

換句話說。這個神奇的tick函數會是什麼樣子?

var el = $('selector'); 
log(el.css("left"));   // 10 

el.animate({left:"-=5"}, 1000); 

log(el.css("left"));   // ≈10 
jQuery.tick(1000);    // accelerate 
log(el.css("left"));   // 5 

簡單地嘲笑setInterval和setTimer似乎不夠。

更新

我接受了@ jfriend00的答案直接掛鉤到jQuery的動畫速度(真棒)。但對於單元測試來說,只需關閉fx引擎即可。 +1爲這些答案!

+1

要求用戶翻轉[渦輪開關(http://en.wikipedia.org/wiki/Turbo_button):d – 2011-12-17 17:40:58

+0

你的意思是,除了使用'.stop(假,真)'? – 2011-12-17 17:45:03

回答

3

現有的動畫功能所做的第一件事就是致電jQuery.speed(),通過各種參數選項對animate()進行排序,以確定速度和其他選項。您可以修補該功能並將速度更改爲較短的值。

jQuery.oldSpeed = jQuery.speed; 
jQuery.speed = function() { 
    var opt = jQuery.oldSpeed.apply(this, arguments); 
    opt.duration = Math.floor(opt.duration/10); 
    return(opt);   
} 

這不會改變動畫一旦它已經開始,但只會削減所有動畫的時間。由於許多其他動畫(或者全部)最終調用.animate()自己,這應該與許多其他動畫工作了。

你可以看到這項工作在這裏:http://jsfiddle.net/jfriend00/6JUGu/。按下「Go Faster」按鈕後,下一個動畫循環將以更快的速度開始。

+1

+1這是一個非常狡猾的解決方案。我應該注意到這一點。 :d – 2011-12-17 17:50:28

1

我認爲你要麼必須設置每個動畫的時間乘數(可能不是一個選項)

,或者你可以設置$.fx.off = true;(http://api.jquery.com/jQuery.fx .off /)立即看到區別。 (你不會看到加速度,只是瞬間改變)。

+0

當我打開fx.off是動畫調用同步嗎? – 2011-12-17 17:45:39

0

或者只是減少持續時間小於1000? :)

2

單元測試藉口,我假設你想跳過所有的動畫但仍保持其預期的效果?

如果這是你想要的,你可以只設置$.fx.off = true,這將在全球範圍從補間,或動畫禁用所有jQuery的動畫,但他們都還去他們的邏輯結束。所以.animate()成爲基本相同.css()因爲缺少動畫。

如果您正在尋找更多模塊化的東西,您可以考慮在您的元素上調用.stop(bool,bool)。例如,在第二個參數中傳入true,可以停止所選元素上當前運行的動畫跳轉到動畫的邏輯結尾。