Как сохранить локальные переменные в функциях щелчка jQuery?
Я пытаюсь выяснить, как хранить значения внешних переменных в функциях, созданных во время события click() jQuery. Вот пример кода, с которым я сейчас работаю.
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". Я не уверен, как настроить закрытую переменную в этой ситуации.
5 ответов
вы можете создать закрытие и назначить i
к локальной переменной закрытия. The gid
переменной будет присвоено значение i
в момент создания закрытия, а не при запуске функции.
for(var i=0; i<3; i++){
(function() {
var gid = i;
$('#tmpid'+i).click(function(){
alert(gid);
});
})();
}
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]);
});
вы создали закрытие, где переменная "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 закрытие внутри петли – простой практический пример
кроме того, первый аргумент click (или bind) для jQuery-это объект, который присоединяется к событию как данные.
for(var i=0; i<3; i++){
$('#tmpid'+i).click({gid : i}, function(e) {
alert(e.data.gid);
});
}
Я нахожу это немного более читаемым, чем решение закрытия, но оно сводится к вкусу.
Я прочитал резервную копию собственного метода data() jQuery. Я реализовал это, и это тоже работает. Его скрытие некоторых фактических функций того, как обрабатываются закрытия, но его простой и довольно чистый для реализации.