2015-11-16 88 views
0

我有一個代碼:EQ :()不能正常工作

 $("#button").click(function() { 
      for (var i = 0; i < 4; i++) { 
       setTimeout(function() { 
        $(".rows:eq("+i+")").css("background-color", "blue"); 
       },500); 
      } 
     }); 

出於某種原因,只有第五元素獲得背景色灰。哪裏不對?

+1

小心把HTML – jstuartmilne

+1

當你的第一個超時功能已經執行,'i'已經增加到4.把'for'循環放入超時函數。 –

+0

您需要使用閉包器 –

回答

2

它與i變量的範圍有關。它綁定到for循環,而不是由setTimeout調用的函數。基本上,當調用延遲函數時,i已經增加到4.爲了綁定當前循環值i,調用另一個函數。 i被放置在函數堆棧上,因此如果被保存則值。

這取決於你在尋找什麼樣的行爲,但是如果你想一次改變所有元素的CSS @Josh的評論是最好的。

$("#button").click(function() { 
    setTimeout(function(){ 
    for (var i = 0; i < 4; i++) { 
     $(".rows:eq("+i+")").css("background-color", "blue"); 
    } 
    ,500); 
}); 

否則嘗試:

bindItoFunc = function (i) { 
    return function(){ 
    $(".rows:eq("+i+")").css("background-color", "blue"); 
    }; 
} 
$("#button").click(function() { 
    for (var i = 0; i < 4; i++) { 
    setTimeout(bindItoFunc(i),500); 
    } 
}); 

也許更優雅的解決方案是結合i作爲函數的this值。

bindItoFunc = function() { 
    $(".rows:eq("+this+")").css("background-color", "blue"); 
} 
$("#button").click(function() { 
    for (var i = 0; i < 4; i++) { 
    setTimeout(bindItoFunc.bind(i),500); 
    } 
}); 

提問者表示背景應該按順序改變。在這種情況下,請根據i更改waitMs。

bindItoFunc = function() { 
    $(".rows:eq("+this+")").css("background-color", "blue"); 
} 
$("#button").click(function() { 
    for (var i = 0; i < 4; i++) { 
    setTimeout(bindItoFunc.bind(i),500+(100*i)); 
    } 
}); 
+0

這兩種解決方案都可以使所有div同時處於藍色。我需要讓它們變成藍色。 – WhilseySoon

+0

我已經更新了答案,查看了最後一個例子。這是你想實現的嗎? –

+0

是的,謝謝。 – WhilseySoon

0

嘗試使用.delay().queue(),遞歸後最初設置.eq()event.data調用click處理器與.row遞增.index()作爲參數:0

// `0` : `event.data` 
 
$("#button").click(0, function re(event) { 
 
    var i = typeof event.data === "number" ? event.data : event; 
 
    $(".row").eq(i).delay(500).queue(function() { 
 
    $(this).css("background-color", "blue"); 
 
    if ($(this).index(".row") < 3) { 
 
     re(i + 1) 
 
    } 
 
    }) 
 
})
.row { 
 
    color:orange; 
 
    width:36px; 
 
    padding:8px; 
 
    font-weight:bold; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> 
 
</script> 
 
<button id="button">click</button> 
 
<span class="row">0</span> 
 
<span class="row">1</span> 
 
<span class="row">2</span> 
 
<span class="row">3</span> 
 
<span class="row">4</span>

+0

爲什麼我們需要這個? 'var i = typeof e!==「number」? 0:e;' – WhilseySoon

+0

@Somaroton'e'在第一次調用're'時將成爲處理函數中'click'的'event'對象。另一個選擇是將'data'傳遞給點擊處理程序。 – guest271314

+0

@Somaroton使用'event.data'查看更新後的文章實現 – guest271314