«Живые» события
Я тут немного забегу вперёд, так что если чего стало непонятно, отложите данный раздел «на потом».
Стоит обратить внимание на ещё одну задачку, которая очень часто ставится перед разработчиком – это добавление обработчиков событий для элементов, которые добавляются на страницу динамически. Пожалуй, надо привести пример подобной задачи:
– У нас есть HTML-страница, на которой все внутренние ссылки будут подгружаться через AJAX, данное утверждение справедливо и для подгружаемого HTML тоже.
Первое условие решается просто:
$("a[href^=\\/]").on("click", function() {
var url = $(this).attr("href");
$("body").load(url + " body > *");
return false;
});Для наглядности условимся, что внутренние ссылки содержат относительные пути от корня сайта.
Со вторым условием чуть-чуть посложнее ситуация, но тоже вполне решаема:
$("body").on("click", "a[href^=\\/]", function() {
var url = $(this).attr("href");
$("body").load(url + " body > *");
return false;
});Отличий не так уж и много, проясню происходящее:
первым делом на элемент
<body>будет повешен обработчик событияclickданный обработчик будет срабатывать только в том случае, когда событие будет относиться к элементу
Работа данной схемы базируется на «всплытии» событий, так что, используя метод event.stopPropagation(), вы сможете предотвратить выполнение «живых» обработчиков.
Лирическое отступление к истории: жил да был когда-то плагин для jQuery, назывался «live», позволял он вешать обработчики на элементы DOM-дерева, которых ещё нет (подгружаемые через AJAX или ещё как), а потом
он умерего внесли в само ядро. Методlive()к тому времени работал лишь сdocument. Затем появился методdelegate(), который научился вешать обработчик на произвольный элемент, а затем и он был поглощён методомon(). Так что не пугайтесь сильно, если встретите старый методlive(), адаптировать под новые версии jQuery его будет не так уж и сложно (ну, я на это надеюсь).
Last updated