2010-01-25 43 views
63

我需要執行一段JavaScript代碼,每個代碼說2000毫秒。JavaScript中的循環定時器

setTimeout('moveItem()',2000) 

上述將在2000毫秒後執行一個函數,但不會再執行一次。

所以我的移動選項功能裏面我有:

function moveItem() { 
    jQuery(".stripTransmitter ul li a").trigger('click'); 
    setInterval('moverItem()',2000); 
} 

這不工作,因爲我要執行的觸發點擊jQuery的一段代碼2000毫秒每間隔,但現在它被稱爲所有時間和腳本需要中斷。除此之外,我覺得這是非常糟糕的質量編碼......你們如何解決這個問題?

+0

時,必須在腳本被中斷? – Natrium 2010-01-25 15:19:13

+1

嗨,我永遠不會打斷它。 – 2010-01-25 15:27:40

回答

175

注意setTimeoutsetInterval是非常不同的功能:

  • setTimeout將執行代碼一次,超時後。
  • setInterval將在提供的超時間隔內執行代碼永遠

兩個函數返回一個計時器ID您可以使用中止超時。您所要做的就是將該值存儲在變量中,並分別用作參數clearTimeout(tid)clearInterval(tid)

所以,這取決於你想要做什麼,你有兩個有效選擇:

// set timeout 
var tid = setTimeout(mycode, 2000); 
function mycode() { 
    // do some stuff... 
    tid = setTimeout(mycode, 2000); // repeat myself 
} 
function abortTimer() { // to be called when you want to stop the timer 
    clearTimeout(tid); 
} 

// set interval 
var tid = setInterval(mycode, 2000); 
function mycode() { 
    // do some stuff... 
    // no need to recall the function (it's an interval, it'll loop forever) 
} 
function abortTimer() { // to be called when you want to stop the timer 
    clearInterval(tid); 
} 

兩個殊途同歸的很常見的方法。

+0

與第一個一起去。它更好。只需讓超時函數爲自己創建一個新的超時調用。 – a432511 2010-01-25 15:20:18

+0

嘿,米格爾,謝謝,這解決了這個問題,它是如此簡單,我覺得有點荒謬...... – 2010-01-25 16:01:56

+2

你讓我明白'setTimeout'和'setInterval'之間,謝謝@Miguel Ventura – 2012-12-06 09:31:57

6
setInterval(moveItem, 2000); 

執行該功能moveItem每2秒的方式。你的代碼中的主要問題是你在回調中調用setInterval,而不是在回調之外。如果我理解你想要做什麼,你可以使用這個:

function moveItem() { 
    jQuery('.stripTransmitter ul li a').trigger('click'); 
} 

setInterval(moveItem, 2000); 

注意:不要字符串傳遞給setTimeoutsetInterval - 最好的辦法是通過匿名函數或函數的標識符(如我以上做過)。另外,請小心不要混用單引號和雙引號。挑一個並堅持下去。

-3

你應該嘗試這樣的事:

function update(){ 
    i++; 
    document.getElementById('tekst').innerHTML = i; 
    setInterval(update(),1000); 
    } 

這意味着,你必須建立在你做你需要做的東西的函數,確保它會以您喜歡的時間間隔自行調用。在你的身體的onload調用該函數的第一次是這樣的:

<body onload="update()"> 
+1

代碼被破壞。您將'undefined'傳遞給setInterval並遞歸調用'update()'而不會暫停。 (提示:update()的返回值就是你在這裏傳遞給setInterval的那個值) – slebetman 2010-01-25 15:22:46

+1

-1你每次調用這個函數時都會創建一個新的重複時間間隔......它顯然是錯誤的......並且與OP詢問的問題相同幫助.. – 2010-01-25 17:25:33

2

它應該是:

function moveItem() { 
    jQuery(".stripTransmitter ul li a").trigger('click'); 
} 
setInterval(moveItem,2000); 

setInterval(f, t)調用參數的功能,f,每t毫秒一次。

0

這裏的自動循環功能與html代碼。我希望這可能對某人有用。

<!DOCTYPE html> 
<html> 
<head> 
<style> 
div { 
position: relative; 
background-color: #abc; 
width: 40px; 
height: 40px; 
float: left; 
margin: 5px; 
} 
</style> 
<script src="http://code.jquery.com/jquery-latest.js"></script> 
</head> 
<body> 
<p><button id="go">Run »</button></p> 
<div class="block"></div> 
<script> 

function test() { 
$(".block").animate({left: "+=50", opacity: 1}, 500); 
    setTimeout(mycode, 2000); 
}; 
$("#go").click(function(){ 
test(); 
}); 
</script> 
</body> 
</html> 

小提琴:DEMO