2013-05-21 38 views
1

我有一個名爲RotatorNames的數組。它包含隨機的東西,但我們只是說它包含["rotatorA","rotatorB","rotatorC"]如何使用setTimeout或setInterval減慢循環

我想遍歷數組,併爲每個項目我想觸發一個點擊事件。我已經有了一些工作,除了一切都立即觸發。我如何強制循環等待幾秒鐘,然後繼續循環。

這是我的。

function Rotator() { 
    var RotatorNames = ["rotatorA","rotatorB","rotatorC"]; 
    RotatorNames.forEach(function(entry){ 
     window.setTimeout(function() { 
      //Trigger that elements button. 
      var elemntBtn = $('#btn_' + entry); 
      elemntBtn.trigger('click'); 
     }, 5000); 
    }); 
} 

你可以運行這個來看看我的問題是什麼。 http://jsfiddle.net/BxDtp/ 此外,有時警報會做A,C,B而不是A,B,C。

回答

5

雖然我相信其他的答案工作,我寧願使用此設置:

function rotator(arr) { 
    var iterator = function (index) { 
     if (index >= arr.length) { 
      index = 0; 
     } 
     console.log(arr[index]); 
     setTimeout(function() { 
      iterator(++index); 
     }, 1500); 
    }; 

    iterator(0); 
}; 

rotator(["rotatorA", "rotatorB", "rotatorC"]); 

DEMO:http://jsfiddle.net/BxDtp/4/

對我來說,看起來更符合邏輯,而不是試圖通過將「正確」值傳遞給setTimeout來使迭代正確排列。

這允許數組不斷迭代,依次。如果您希望在經過一次後停止,請將index = 0;更改爲return;

+1

非常好,這實際上也讓人回想起來。謝謝! – ipixel

+1

太好了:) –

3

可以增加基於當前指數超時:

RotatorNames.forEach(function(entry, i) { 
    window.setTimeout(function() { 
     //Trigger that elements button. 
     var elemntBtn = $('#btn_' + entry); 
     elemntBtn.trigger('click'); 
    }, 5000 + (i * 1000)); // wait for 5 seconds + 1 more per element 
}); 
+0

這個偉大的工程,但由於某種原因,第一陣列項目獲得的重複它去之前B和C – ipixel

+0

我想出了爲什麼。這是因爲即時啓動forloop爲0,默認情況下已經顯示0。 – ipixel

-1

像這樣的事情應該怎麼做你後:

function Rotator(index){ 
    var RotatorNames = ["rotatorA","rotatorB","rotatorC"]; 
    index = (index === undefined ? 0 : index); 

    var $btn = $("#btn_"+RotatorNames[index]); 
    $btn.click(); 

    if(RotatorNames[index+1]!==undefined){ 
    window.setTimeout(function(){ 
     Rotator(index+1); 
    }, 500); 
    } 
} 
+0

有趣的方法。謝謝,我會牢記這一點。 – ipixel

0

嘗試:

var idx = 0; 
function Rotator() { 
    var RotatorNames = ["rotatorA", "rotatorB", "rotatorC"]; 
     setTimeout(function() { 
      console.log(RotatorNames[idx]); 
      idx = (idx<RotatorNames.length-1) ? idx+1:idx=0; 
      Rotator(); 
     }, 5000); 
} 
Rotator(); 

jsFiddle example

(請注意,我用的alertconsole.log代替)