Это связано с областью определения переменной i
. Он привязан к циклу for, а не к функции, вызываемой setTimeout. В основном, когда вызывается функция задержки, i
уже имеет приращение до 4. Чтобы связать текущее значение цикла i
, вызовите другую функцию. i
помещается в стек функций, поэтому значение сохраняется.
Это зависит от того, какое поведение вы ищете, но если вы хотите изменить css всех элементов сразу @ комментарий Джоша является лучшим.
$("#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);
}
});
Вопрос спросил, что фон должен меняться по порядку. В этом случае измените waitM на основе i
.
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));
}
});
уход поставить HTML – jstuartmilne
Когда ваша первая функция таймаута выполнил, 'i' уже был увеличен до 4. Поместите цикл' for' в функцию таймаута. –
вам нужно использовать закрывающее устройство –