如果你想避免使用setInterval並將調用限制在列表的長度上,您可以創建一個自我執行的函數來保存當前的索引,而不是使用閉包中的索引。閉包中的變量將始終是每個循環中的最後一個元素,因爲循環將在讀取setTimeout函數中的變量之前完成。
你也在調用clearTimeout函數,在這種情況下,這對我來說並沒有什麼意義。
最重要的是,你所有的setTimeout將會幾乎同時被調用。這會導致屏幕上的所有值閃爍幾毫秒(或在某些情況下太快而無法看到)。循環在這裏並不合適,因爲setTimeout函數是異步的。一個回調系統最適合有限次數的運行,而setInterval系統最適合未知數量的運行。對我來說,你的運行次數應該是你的jQuery對象中的元素數量(當前正在通過你的$ .each())的元素數量
我建議你做一些類似下面的問題的一般化例子(因爲我沒有訪問你的dom,所以一般化)。
function showMessage(message){
$('body').html(message);
}
var itemData = [1,2,3,4];
var i = 0;
function idTimer(list, i) {
if (!(i >= 0)) {
i= 0;
}
setTimeout((function(msg){
i++;
return function(){
if(i < list.length){
idTimer(list, i);
}
showMessage(msg);
}
})(list[i]), 1000);
}
idTimer(itemData);
這段代碼的現場演示,可以發現:http://jsbin.com/ifuqo
謝謝你,我也是這樣做的。雖然沒有回調,但看起來很有趣。我已經設置了一個全局計數器和一個數組。在ajax函數中,我將數據推送到數組,並在接收到任何數據時設置setinterval()。 – Richard 2009-11-24 22:31:48
遵循這種語法是相當困難的,但我會檢查出這個鏈接。 – Richard 2009-11-24 22:43:07