2011-03-29 111 views
1

我被要求做一個小的div循環淡入和淡出效果。有幾種方法可以做到這一點,但我想知道爲什麼只有一次運行效果。setTimeout不遞歸調用匿名函數

$(document).ready(function() { 
    (function(){ 
     setTimeout(function(){$("#foo").fadeOut().delay(800).fadeIn(800);},0) 
    })(); 
}); 

據我所知,該函數應該遞歸運行,但它不會。

我用setInterval(function(){$("#foo").fadeOut().delay(800).fadeIn(800);}, 0);去了,因爲它完成了工作,但我仍然想知道爲什麼setTimeout沒有按預期工作。

+2

你爲什麼認爲它會遞歸運行? – Shad 2011-03-29 04:26:21

回答

6

請你不要爲這使用setInterval

你打電話setInterval延遲0.這意味着它將繼續執行 - 比動畫可以完成更快。這將繼續向jQuery的內部隊列添加動畫效果,隨着時間的推移構建內存使用情況。

可能將延遲時間增加到至少等於動畫長度的值,但這是不可靠的。定時器(和動畫)可以被其他代碼延遲,並且應該避免這種硬編碼。

相反,採取這種做法:

function fadeInOut() { 
    $("#foo").fadeOut().delay(800).fadeIn(800, fadeInOut); 
} 
fadeInOut(); 

在這裏,你是路過的fadeInOut功能爲jQuery的時候完成的fadeIn動畫被自動調用回調函數。這保證了一個新的動畫循環直到前一個循環完成纔會開始。

+0

我想完成一行工作,但這顯然是更負責任的方法。謝謝你的提示。 – 2011-03-29 04:45:36

+0

這比我的優雅。 – RSG 2011-03-29 04:49:51

4

setTimeout(fx,delay)將在延遲過去時被調用一次。在這種情況下,使用延遲0來調用它與在沒有超時的情況下調用代碼相同。

setInterval被稱爲每次間隔過去後,你的情況所有的時間因爲間隔爲0。我想你想要更多的東西一樣:

setInterval(function(){ 
    $('#foo').toggleFade(800); 
}, 800); 

My favorite timeout vs interval posting

+0

@Shrinath什麼時候人們要停止引用回調函數? – alex 2011-03-29 04:30:41

+3

你可以用setInterval阻塞調用堆棧。如果函數運行時間超過800毫秒,該怎麼辦?讓函數再次調用setTimeout是更好的IMO。 – 2011-03-29 04:33:28

+0

@alex當人們停止轉介w3schools。 http://w3fools.com – 2011-03-29 04:34:24

0

這裏是二者的定義

setTimeout - setTimeout函數延遲了指定的時間段,然後
觸發執行指定的功能。一旦功能被觸發,setTimeout
已經完成。在使用clearTimeout函數觸發函數之前,您當然可以終止setTimeout的執行。

的setInterval -的setInterval函數也延遲了指定的時間之前
觸發一個特定的功能的執行。不同之處在於在觸發該功能之後
該命令沒有完成。相反,它會再次等待指定的時間,然後再次觸發該功能並繼續重複執行此過程,以指定的時間間隔觸發該功能,直到
, 網頁被卸載或調用clearInterval函數爲止。

0

的setTimeout(FUNC,millis)來表示, 「米利斯過去後,我將調用FUNC」。你的功能是

function(){ 
    $("#foo").fadeOut().delay(800).fadeIn(800); 
} 

所以經過零毫秒後,你的函數被調用。但是你的函數中沒有任何東西告訴它再次調用setTimeout。

像這樣將工作:

function my_func() { 
    // do something 
    setTimeout(my_func, 1000); 
} 

my_func(); 
相關問題