Как сделать раннее связывание для обработчика событий в JavaScript? (пример с jQuery)
Позднее связывание 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(' ');
}
}
3 ответа
Вы можете передать данные в 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, поэтому сделайте локальную копию, как у меня выше.
Вы также можете значительно сократить это с помощью цепочки, но я чувствую, что в этом случае это омрачает смысл, поскольку проблема заключается в определении объема и ссылках.