2009-09-30 95 views
49

我還是新來的JQuery,在讓我的ajax例子工作的方式我被setTimeout停滯。我已經把它分解到它應該添加的地方。「每秒鐘到div。jQuery,setTimeout不工作

相關的代碼有兩個文件。

的index.html

<html><head> 
<script type='text/javascript' src='jquery.js'></script> 
<script type='text/javascript' src='myCode.js'></script> 
</head> 
<body> 
<div id='board'>Text</div> 
</body> 
</html> 

myCode.js

(function(){ 
    $(document).ready(function() {update();}); 

    function update() { 
     $("#board").append("."); 
     setTimeout('update()', 1000);  } 
})(); 

的myCode.js文件工作正常的和 「更新()」 通過,但從來沒有再次運行在第一時間。

回答

110

這裏有幾個問題。

首先,您要在anonymous function內定義您的代碼。這個構造:

(function() { 
    ... 
)(); 

做了兩件事。它定義了一個匿名函數並調用它。有範圍的原因做到這一點,但我不知道這是你真正想要的。

您正在將代碼塊傳遞至setTimeout()。問題是update()在執行時不在範圍內。然而它,如果你在一個函數指針傳遞代替其工作原理:

(function() { 
    $(document).ready(function() {update();}); 

    function update() { 
    $("#board").append("."); 
    setTimeout(update, 1000);  } 
    } 
)(); 

,因爲函數指針update是該塊的範圍之內。

但就像我說的,沒有必要爲匿名函數,所以你可以把它改寫這樣的:

$(document).ready(function() {update();}); 

function update() { 
    $("#board").append("."); 
    setTimeout(update, 1000);  } 
} 

$(document).ready(function() {update();}); 

function update() { 
    $("#board").append("."); 
    setTimeout('update()', 1000);  } 
} 

而且這兩個工作。第二個原因是代碼塊中的update()現在在範圍內。

我也喜歡$(function() { ... }縮短塊形式,而不是調用內update()setTimeout()你可以用setInterval()代替:

$(function() { 
    setInterval(update, 1000); 
}); 

function update() { 
    $("#board").append("."); 
} 

希望掃清這件事。

+0

謝謝,它工作。任何人都可以解釋爲什麼它不像以前那樣工作嗎?我看過的每個示例都與我使用的格式更類似。 – 2009-09-30 03:00:12

+0

是w3schools真的是最好的參考資源?如果他以此頁爲例,他會犯同樣的錯誤。 – 2009-09-30 03:03:30

+3

w3schools在這種情況下是正確的。這個問題是一個範圍問題。 – cletus 2009-09-30 03:25:23

19
setInterval(function() { 
    $('#board').append('.'); 
}, 1000); 

如果您想在一點停止它,則可以使用clearInterval。

+1

我以前沒有使用過setInverval,但它似乎是實現我的目標的更直接的路線。謝謝 – 2009-09-30 03:10:35

+0

cletus似乎已將它添加到他的解決方案中;要學習的重要一點是你應該給setInterval/setTimeout一個實際的函數,而不是一個將被評估的字符串,例如'update()' – 2009-09-30 03:14:01

+2

傳遞一個像'update()'這樣的代碼塊是有效的,但不是首選。 – cletus 2009-09-30 03:26:00

8

SetTimeout用於使您的代碼集在指定的時間段後執行,因此您的需求最好使用setInterval,因爲它會每隔指定的時間間隔調用您的函數。

+3

我不同意,setTimout是更好的做法,在功能更新()花費超過1秒運行的情況下,您可能有多個相同功能的實例運行在相同時間。如果使用setTimeout,則函數update()必須在下一次循環時間之前完全結束,因此一次只能運行一個實例。 – kamui 2012-03-15 07:59:13

0

這完成同樣的事情,但要簡單得多:

$(document).ready(function() { 
    $("#board").delay(1000).append("."); 
}); 

你可以連續使用之前的延遲幾乎所有的jQuery方法。