Как сохранить локальные переменные в функциях щелчка jQuery?
Я пытаюсь выяснить, как хранить внешние значения переменных в функциях, созданных во время события jQuery click(). Вот пример кода, с которым я сейчас работаю.
for(var i=0; i<3; i++){
$('#tmpid'+i).click(function(){
var gid = i;
alert(gid);
});
}
<div id="tmpid0">1al</div>
<div id="tmpid1">asd</div>
<div id="tmpid2">qwe</div>
Итак, что происходит в том, что события правильно подключаются, но значение "gid" всегда является последним добавочным значением "i". Я не уверен, как настроить приватную переменную в этой ситуации.
Ответы
Ответ 1
Вы можете создать закрытие и назначить i
локальной переменной закрытия. Затем переменной gid
присваивается значение i
в точке, где было создано закрытие, а не при выполнении функции.
for(var i=0; i<3; i++){
(function() {
var gid = i;
$('#tmpid'+i).click(function(){
alert(gid);
});
})();
}
Ответ 2
for(var i=0; i<3; i++){
$('#tmpid'+i).click((function(gid){
return function(){
alert(gid);
}
})(i));
}
есть много способов сделать это, это работает и выглядит легко.
изменить
другой способ:
for(var i=0; i<3; i++){
$('#tmpid'+i).click([i],function(e){
alert(e.data[0]);
});
Ответ 3
Вы создали закрытие, где переменная "i" делится между несколькими обработчиками кликов.
Поскольку Javascript не имеет области блока, вам нужно передать "i" в новую функцию, чтобы она копировалась по значению в новый экземпляр:
function bindStuff(i) {
$('#tmpid'+i).click(function(e){
var gid = i;
alert(gid);
});
}
for(var i=0; i<3; i++){ bindStuff(i); }
Вот еще один подобный вопрос:
Закрытие JavaScript внутри цикла - простой практический пример
Ответ 4
В качестве альтернативы первый аргумент click (или bind) для jQuery - это объект, который привязывается к событию как данные.
for(var i=0; i<3; i++){
$('#tmpid'+i).click({gid : i}, function(e) {
alert(e.data.gid);
});
}
Я считаю это немного более понятным, чем решение для закрытия, но оно сводится к вкусу.
Ответ 5
Я читаю резервную копию на основе метода jQuery native data(). Я реализовал это, и он работает. Его скрывают некоторые из фактических функциональных возможностей того, как обрабатываются блокировки, но его простые и довольно чистые для реализации.