2011-12-19 374 views
0

這是我的功能,當被調用時,相關節點變成紅色,然後什麼都不做。
這裏是JavaScript:Javascript setTimeout issue w/for循環

function blink (node, flickers) 
{ 
    originalColour = node.style.color; 
    for (i = 1; i <= (flickers*2); i++) 
     { 
     setTimeout (function() {ChangeColor (node, (((i%2) == 0) ? (originalColour) : ('red')))}, (i*200)); 
     } 
} 
function ChangeColor (node, color) 
{ 
    node.style.color = color; 
} 

回答

3

i是 「i當匿名函數被稱爲」 不 「isetTimeout被稱爲」。

您需要創建一個閉包,並將當前值i傳遞給它。

function ChangeColorLater(i) { 
    return function() { 
     ChangeColor (node, (((i%2) == 0) ? (originalColour) : ('red'))) 
    } 
} 

setTimeout (ChangeColourLater(i), (i*200)); 
+0

我真的很抱歉,這是你的意思: 功能眨眼(節點,閃爍) { \t警報( '開始'); \t originalColour = node.style.color; \t爲(I = 1; I <=(閃爍* 2);我++) \t \t { \t \t警報(ⅰ); setTimeout(ChangeColourLater(i,node),(i * 200)); \t \t} } 功能ChangeColorLater(I,節點) { \t警報( 「2」 + I); 返回功能(){ ChangeColor(節點,(((I%2)== 0)(originalColour):( '紅'))) } } 功能ChangeColor(節點,顏色) { \t node.style.color = color; } – 2011-12-19 23:37:33

+0

對不起,我不知道我在做什麼與stackoverflow - 我不能得到代碼標籤工作的意見 - 我會最終弄清楚 – 2011-12-19 23:40:21

1

的問題是,在每一個超時執行時間,i是等於閃爍* 2

使用閉合,可以捕捉i的值時的超時被設置,並且該通到您的ChangeColor功能。在執行回調時,index(下面)將等於設置超時時的i值。

你想要的是:

function blink (node, flickers) { 
    var originalColour = node.style.color; 
    for (var i = 1; i <= (flickers*2); i++) { 
     setTimeout (function (index) { // current value for i in loop becomes var index 
      return function() { 
       ChangeColor(node, (index % 2 == 0) ? originalColour : 'red'); 
      } 
     }(i), i*200) 
    } 
} 
function ChangeColor (node, color) { 
    node.style.color = color; 
} 
0

有點更容易閱讀。 http://jsfiddle.net/wUkfe/22/

function blink(node, flickers){ 

    var color = node.style.color; 

    (function blinker(){ 

    node.style.color = (flickers % 2) ? "red" : color; 

    if (flickers--){ 
     setTimeout(blinker, 1000); 
    } 

    })(); 

}