У меня есть вопрос, аналогичный приведенному здесь: Обработчики событий внутри цикла Javascript - нужно закрытие?, но я использую jQuery, и данное решение, похоже, запускает событие, когда оно привязано, а не при щелчке.
Вот мой код:
for(var i in DisplayGlobals.Indicators)
{
var div = d.createElement("div");
div.style.width = "100%";
td.appendChild(div);
for(var j = 0;j<3;j++)
{
var test = j;
if (DisplayGlobals.Indicators[i][j].length > 0)
{
var img = d.createElement("img");
jQuery(img).attr({
src : DisplayGlobals.Indicators[i][j],
alt : i,
className: "IndicatorImage"
}).click(
function(indGroup,indValue){
jQuery(".IndicatorImage").removeClass("active");
_this.Indicator.TrueImage = DisplayGlobals.Indicators[indGroup][indValue];
_this.Indicator.FalseImage = DisplayGlobals.IndicatorsSpecial["BlankSmall"];
jQuery(this).addClass("active");
}(i,j)
);
div.appendChild(img);
}
}
}
Я безуспешно пробовал несколько разных способов ...
Первоначальная проблема заключалась в том, что _this.Indicator.TrueImage всегда был последним значением, потому что я использовал счетчики циклов, а не параметры, чтобы выбрать правильное изображение.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам не хватает функции. Функция .click нуждается в функции в качестве параметра, поэтому вам нужно сделать это:
.click(
function(indGroup,indValue)
{
return function()
{
jQuery(".IndicatorImage").removeClass("active");
_this.Indicator.TrueImage = DisplayGlobals.Indicators[indGroup][indValue];
_this.Indicator.FalseImage = DisplayGlobals.IndicatorsSpecial["BlankSmall"];
jQuery(this).addClass("active");
}
}(i,j);
);
Решение Грег по-прежнему действует, но вы можете сделать это без создания дополнительного закрытия сейчас, используя параметр eventData метода jQuery щелкнуть (или связывать или любой другой метод привязки событий, если на то пошло).
.click({indGroup: i, indValue : j}, function(event) {
alert(event.data.indGroup);
alert(event.data.indValue);
...
});
Выглядит намного проще и, вероятно, более эффективно (на одно закрытие на итерацию меньше).
В документации по методу связывать есть описание и несколько примеров по данным событий.
Ответ Никита работает нормально, если вы используете jQuery 1.4.3 и новее. Для версий, предшествующих этой (до 1.0), вам нужно будет использовать связывать следующим образом:
.bind('click', {indGroup: i, indValue : j}, function(event) {
alert(event.data.indGroup);
alert(event.data.indValue);
...
});
Надеюсь, это поможет всем, кто все еще использует 1.4.2 (например, я)