Как скопировать переменную в JavaScript? - PullRequest
3 голосов
/ 04 марта 2010

У меня есть этот код JavaScript:

for (var idx in data) {
    var row = $("<tr></tr>");
    row.click(function() { alert(idx); });
    table.append(row);
}

Итак, я просматриваю массив, динамически создавая строки (часть, в которой я создаю ячейки, опущена, поскольку это не важно).Важно, чтобы я создал новую функцию, которая заключает в себе переменную idx.

Тем не менее, idx является только ссылкой, поэтому в конце цикла все строки имеют одинаковую функцию и все оповещают об одном и том же значении.

В настоящий момент я могу решить эту проблему следующим образом:

function GetRowClickFunction(idx){
    return function() { alert(idx); }
}

, и в коде вызова я звоню

row.click(GetRowClickFunction(idx));

Это работает, но несколько уродливо,Интересно, есть ли лучший способ просто скопировать текущее значение idx внутри цикла?

Хотя сама проблема не является специфичной для jQuery (она связана с замыканиями / областями JavaScript), я использую jQuery и, следовательно,Решение jQuery-only хорошо, если оно работает.

Ответы [ 2 ]

9 голосов
/ 04 марта 2010

Вы можете поместить функцию в свой цикл:

for (var idx in data) {
  (function(idx) {
    var row = $("<tr></tr>");
    row.click(function() { alert(idx); });
    table.append(row);
  })(idx);
}

Теперь, реальный совет, который я хотел бы дать вам, состоит в том, чтобы прекратить делать привязку вашего события подобным образом и начать использовать jQuery "живой" или "делегировать" API. Таким образом, вы можете настроить один обработчик для всех строк в таблице. Присвойте каждой строке значение "idx" в качестве элемента "id" или "class" или чего-то еще, чтобы вы могли извлечь его в обработчике. (Или, я думаю, вы могли бы спрятать его в "данных").

2 голосов
/ 04 марта 2010

Проверьте метод данных jquery ():

http://api.jquery.com/jQuery.data/

Описание: хранить произвольные данные, связанные с указанным элементом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...