2011-12-19 29 views
0

これは私の関数です。これは、関連ノードが呼び出されたときに赤くなり、何もしません。ここ
はjavascriptのです:Javascript setTimeout issue for 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はない "setTimeoutが呼び出されるi" "無名関数が呼び出されたときにi" です。

クロージャを作成し、現在の値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); iは++) \t \t { \t \tアラート(I)。 \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; } –

+0

申し訳ありませんが、私はstackoverflowで何をやっているのか分かりません - 私はコメントで動作するコードタグを取得することはできません - 私はそれを最終的に把握します –

1

問題は、各タイムアウトが実行される時に、私はタイムアウトが設定されている場合、あなたはiの値をキャプチャすることができますクロージャを使用して、フリッカ* 2

に等しく、パスということです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); 
    } 

    })(); 

}