2012-04-04 83 views
3

我已經寫了改變調用的setTimeout有一個for循環

我已經成功地使用的setTimeout調用的函數在一個特定的時間間隔

現在我」一個div的CSS定位功能m試圖做的是在同一頁上的28個不同的div上調用函數,每個div都有自己的速度。

我的想法是,我可以用一個做到這一點的循環,像這樣:

for (var x = 0; x < 28; x++) 
    { setInterval(function(){changeDirection(divlist[x])}, divs[divlist[x]].speed);} 

使用對象「的div」,其中速度和ID存儲

我能得到他們的唯一途徑所有移動對計時器是調用setInterval的28倍,像這樣......

setInterval(function(){changeDirection(divlist[1])}, divs[divlist[1]].speed); 
setInterval(function(){changeDirection(divlist[2])}, divs[divlist[2]].speed); 
setInterval(function(){changeDirection(divlist[3])}, divs[divlist[3]].speed); 
setInterval(function(){changeDirection(divlist[4])}, divs[divlist[4]].speed);....etc 

for循環沒有工作......

有沒有人有任何想法爲什麼?並有一種方法來調用setInterval許多不同的功能,像這樣一個循環

+0

[在一個for循環setTimeout和傳遞i設定爲值]的可能重複(http://stackoverflow.com/questions/5226285/settimeout-in-a-for-loop-and-pass-i-as-價值) – Bergi 2012-08-29 16:00:31

回答

4

你需要「錨」你的循環迭代器的值,否則它會不斷增加和所有的間隔影響第二十九,不存在。

for(var x=0; x<28; x++) { 
    (function(x) { 
     // code goes here 
    })(x); 
} 

但是,一個頁面上的28個定時器是一個非常糟糕的主意。考慮重寫代碼,以便只有一個時間間隔根據速度值計算新的位置。

+0

偉大的答案...謝謝!我很好奇,想知道爲什麼定時器是不好的原因,因爲它似乎做工精細性能明智 – pepperdreamteam 2012-04-05 17:13:00

+0

火狐滯後可怕的,當我有短短半年同時運行的定時器。或者至少它最後我測試了。 – 2012-04-05 17:31:32

1

我的方法將這些自我通話功能。

var i = -1; 
(function cssPositioning() { 
    i++; 
    if (i < 28) { 
      changeDirection(divlist[i]); 
    setInterval(cssPositioning, divs[divlist[i]].speed); 
    } 
})(); 
1

基於@ Kolink的解釋,你可以嘗試

for (var x = 0; x < 28; x++){ 
    setInterval(function(){ 
    var local = x; //anchor the variable 
    changeDirection(divlist[local])}, divs[divlist[local]].speed); 
    }); 
} 

希望這有助於。