Как сделать раннюю привязку для обработчика событий в JavaScript?(пример с jQuery)

StackOverflow https://stackoverflow.com/questions/2663594

Вопрос

Поздняя привязка JavaScript великолепна.Но как мне выполнить раннюю привязку, когда я захочу?

Я использую jQuery для добавления ссылок с обработчиками событий в цикле в div.Переменная 'aTag ' изменяется в цикле.Когда я нажимаю на ссылки позже, все ссылки выдают одно и то же сообщение, которое является последним значением 'aTag'.Как мне привязать другое предупреждающее сообщение ко всем ссылкам?

Все ссылки должны содержать предупреждение о значении, которое имел 'aTag' при добавлении обработчика событий, а не при нажатии на него.

for (aTag in tagList) {
  if (tagList.hasOwnProperty(aTag)) {
    nextTag = $('<a href="#"></a>');
    nextTag.text(aTag);
    nextTag.click(function() { alert(aTag); });
    $('#mydiv').append(nextTag);
    $('#mydiv').append(' ');
  }
}
Это было полезно?

Решение

Вы можете передавать данные в bind Метод:

nextTag.bind('click', {aTag: aTag}, function(event) {
    alert(event.data.aTag);
});

Это сделает копию aTag, Таким образом, каждый обработчик событий будет иметь разные значения для него. Ваш корпус использования именно причина этого параметра bind существует.

Полный код:

for (aTag in tagList) {
  if (tagList.hasOwnProperty(aTag)) {
    nextTag = $('<a href="#"></a>');
    nextTag.text(aTag);
    nextTag.bind('click', {aTag: aTag}, function(event) {
      alert(event.data.aTag);
    });
    $('#mydiv').append(nextTag);
    $('#mydiv').append(' ');
  }
}

Другие советы

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

function makeAlertHandler(txt) {
  return function() { alert(txt); }
}

и заменить

nextTag.click(function() { alert(aTag); });   

с участием

nextTag.click(makeAlertHandler(aTag));

Вам нужно сохранить копию этой переменной, например, так:

for (aTag in tagList) {
  if (tagList.hasOwnProperty(aTag)) {
    nextTag = $('<a href="#"></a>');
    nextTag.text(aTag);
    var laTag = aTag;
    nextTag.click(function() { alert(laTag); });
    $('#mydiv').append(nextTag);
    $('#mydiv').append(' ');
  }
}

Тот Самый aTag переменная меняется каждый раз, когда вы выполняете цикл, в конце цикла она остается как последний элемент в цикле.Однако каждая из созданных вами функций указывает на это то же самое переменная.Вместо этого вам нужна переменная per, поэтому создайте локальную копию, как у меня выше.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top