Это распространенная проблема, возникающая при объединении замыканий с циклами. JavaScript является языком позднего связывания, и циклы не вводят новую область видимости. Итак:
for (var i= 0; i<5; i++) {
$('#thing'+i).click(function() {
alert(i);
});
}
В этом коде есть только одна i
переменная. Он начинается в 0
и после завершения цикла присваивания остается в 5
. Событие click для элемента #thing0
будет запускаться только после того, как завершит выполнение цикла, к этому моменту значение i
будет 5
. Вы не получите ожидаемое значение 0
, которое вы могли ожидать.
Это относится не только к самой переменной цикла, но и к любым другим переменным, которые вы переопределяете для каждого цикла. Так что в вашем примере значение barChartID
внутри функции обратного вызова анимации всегда будет идентификатором, связанным с последним элементом в вашем цикле.
Обычный обходной путь - взять копию значения переменной цикла в определенное время, используя структуру, которая вводит новую область, а именно другую функцию:
$(barChartID + " img").animate({height: actualBarHeight}, 500, function(barChartID) {
return function() {
$(barChartID + " .value span").css('background-color','white');
};
}(barChartID));
Подробнее о петлевых затворах.