Слушатели событий в JavaScript и обработчики событий
Хорошо, я уже давно пытаюсь понять это, и, наконец, у меня есть время для расследования. Как говорится в заголовке "В чем разница"? Я знаю, что это работает так, как я этого хочу.
addLoadEvent(converter);
// Converter
function converter() {
var pixels = document.getElementById("pixels");
pixels.addEventListener("keyup", updateNode, true);
pixels.addEventListener("keydown", updateNode, true);
}
Но это не так и работает только один раз.
addLoadEvent(converter);
// Converter
function converter() {
var pixels = document.getElementById("pixels");
pixels.onkeydown = updateNode;
pixels.onkeyup = updateNode;
}
Что мне не хватает... В чем разница? Любые ссылки на эту тему будут полезны.
Мое предположение заключалось в том, что обработчик должен действовать как слушатель, но это не так. На самом деле нужно ли добавлять слушателя к функции addLoadEvent?
Ответы
Ответ 1
addEventListener
добавляет функцию события к событию. Таким образом может существовать неограниченное количество обработчиков событий.
Настройка onxxxxx
устанавливает обработчик события в эту функцию.
Из Центра разработчика Mozilla:
addEventListener регистрирует один прослушиватель событий на одной цели. Целевой объект может быть единственным node в документе, самом документе, окне или XMLHttpRequest.
Чтобы зарегистрировать более одного прослушивателя событий для цели, вызовите addEventListener для одной и той же цели, но с разными типами событий или параметрами захвата.
И посмотрите эту главу того же документа для сравнения старого onxxxx
способа.
Ответ 2
Поскольку ECMA script настолько гибок в своем ядре, что позволяет назначать функции, методы... практически все... переменной, имеющей дополнительную функциональность для присоединения функции к переменной, такой как "addEventListener", мое все означает плохой дизайн.
Итак, если вы спросите меня, я расскажу вам все, что сказал Пекка, и я согласен полностью, а также что:
pixels.onkeydown = updateNode;
является ECMA script языковым естественным утверждением и:
pixels.addEventListener("keydown", updateNode, true);
является избыточным дополнением DOM, которое излишне смущает многих разработчиков, заставляя их думать, что произойдет, если вы установите его по первому пути, а некоторые другие script позже могут установить его другим способом:)