Как сохранить локальные переменные в функциях щелчка 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(). Я реализовал это, и он работает. Его скрывают некоторые из фактических функциональных возможностей того, как обрабатываются блокировки, но его простые и довольно чистые для реализации.