Прослушиватели событий критически важны для JS. Каждый раз, когда пользователь взаимодействует с вашей страницей, вам нужно уловить это событие и отреагировать на него.
Конечно, в этом фрагменте ваши функции предполагают, что в DOM есть элемент с заданным идентификатором, готовый, установленный и ожидающий. Это может быть не так, поэтому вам нужно подождать, пока JS не получит OK (событие DOMReady
).
Это всего лишь один очень простой пример того, почему можно использовать addEventListener
. Но, по моему мнению, прослушиватели событий действительно проявляют себя, когда вы начинаете использовать вызовы Ajax для добавления нового контента на свою страницу по мере продвижения:
Предположим, что DOM готов, но некоторые элементы могут или не могут быть запрошены позже. (в зависимости от ввода пользователя). В jQuery вы бы использовали такие вещи:
$('#foo').on('click',functionRef);
Это не требует, чтобы элемент foo был доступен при запуске этого кода, но как только элемент будет добавлен в dom, события щелчка будут обрабатываться по вашему желанию.
В не-jQ вы будете использовать для этого addEventListener
. Из-за модели событий (см. quirksmode для получения подробной информации о распространении и всплытии) прослушиватель не должен быть прикреплен к элементу напрямую:
document.body.addEventListener('click',function(e)
{
if ((e.target || e.srcElemet).id === 'foo')
{
//function that deals with clicks on foo element
}
},false);//last param is for bubbling/propagating events
Таким образом, вы можете асинхронно связывать все события для элементов, которые могут быть добавлены в dom, без необходимости проверять каждый ответ на каждый вызов ajax...
Давайте сделаем еще один шаг вперед: делегирование. Как видите, в приведенном выше фрагменте мы прослушиваем все события кликов, которые происходят где-то внутри body. Это практически не имеет значения: все клики, поэтому вам не нужно добавлять 101 отдельный прослушиватель кликов для 101 элемента, достаточно одного. Единственное, что вам нужно сделать, это написать обработчик таким образом, чтобы он соответствующим образом обрабатывал каждый элемент:
document.body.addEventListener('click',function(e)
{
e = e || window.event;
var elem = e.target || e.srcElement;
switch (true)
{
case elem.id === 'foo':
//either code here or:
return fooCallback.apply(elem,[e]);//use another function as though it were the handler
case elem.id.className.match(/\bsomeClass\b/):
return someClassCallback.apply(elem,[e]);//~= jQuery's $('.someClass').on('click',function);
case elem.type === 'text':
//and so on
}
},false);
Довольно мощная штука. Есть, конечно, и многое другое, и минусы тоже есть (в основном X-браузеры), но основные плюсы:
- Обработка событий для элементов, которые динамически добавляются/удаляются
- Единый прослушиватель событий, который обрабатывает все события для всех элементов, делает ваш код более эффективным, иногда намного повышая производительность. вот хороший пример того, когда делегирование в порядке, к сожалению, это также показывает те трудности, которые приносит разработка X-браузера на вечеринку...
person
Elias Van Ootegem
schedule
20.12.2012