<b> window.location = "logoff.php"; // Перейти на другую страницу</b>
<b>});</b>
В разделе 19.6.4 вы узнаете, что методы поддержки архитектуры Ajax в библиотеке jQuery аналогичным образом рассылают широковещательные события заинтересованным приемникам.
19.4.8. Динамические события
Метод
<b>bind()</b>
связывает обработчики событий с конкретными элементами документа, подобно методам
<b>addEventListener()</b>
и
<b>attachEvent()</b>
(глава 17). Но веб-приложения, использующие библиотеку jQuery, часто создают новые элементы динамически. Если мы воспользуемся методом
<b>bind()</b>
для привязки обработчика событий ко всем элементам
<b><а>,</b>
имеющимся в документе, и затем создадим новые элементы
<b><а>,</b>
эти новые элементы не будут иметь обработчиков событий, которые были в старых элементах, и будут вести себя иначе.
В библиотеке jQuery эта проблема решается с помощью «динамических событий». Чтобы задействовать динамические события, вместо методов
<b>bind()</b>
и
<b>unbind()</b>
следует использовать методы
<b>delegate()</b>
и
<b>undelegate().</b>
Обычно метод
<b>delegate()</b>
вызывается относительно
<b>$(document),</b>
и ему передаются строка селектора, строка с типом события и функция обработчика, а он регистрирует внутренний обработчик в объекте документа или окна (или в любом другом элементе, находящемся в объекте
<b>jQuery</b>
). Когда событие указанного типа всплывет до этого внутреннего обработчика, он выяснит, соответствует ли целевой элемент события (элемент, в котором оно возникло) строке селектора, и вызовет указанную функцию обработчика. То есть, чтобы обеспечить обработку события «mouseover» и в старых, и во вновь созданных элементах
<b><а>,</b>
можно зарегистрировать обработчик, как показано ниже:
<b>$(document).delegate("a", "mouseover", linkHandler);</b>
Или сначала применить метод
<b>bind()</b>
к статической части документа, а затем с помощью метода
<b>delegate()</b>
обработать динамически изменяемую часть:
<b>// Статические обработчики событий для статических ссылок </b>
<b>$("а").bind("mouseover", linkHandler);</b>
<b>// Динамические обработчики событий для фрагментов документа,</b>
<b>// которые изменяются динамически</b>
<b>S(".dynamic").delegate("a", "mouseover", linkHandler);</b>
Подобно тому, как метод
<b>bind()</b>
имеет версию с тремя аргументами, позволяющую указать значение свойства
<b>data</b>
объекта события, метод
<b>delegate()</b>
имеет версию с четырьмя аргументами, позволяющую то же самое. При использовании этой версии дополнительные данные следует передавать в третьем аргументе, а функцию обработчика - в четвертом.
Важно понимать, что динамические события основаны на механизме всплытия. К тому моменту, когда оно всплывет до объекта документа, оно может пройти через множество статических обработчиков. А если какой-либо из этих обработчиков вызовет метод
<b>cancelBubble()</b>
объекта
<b>Event</b>
, динамический обработчик так и не будет вызван.
Объект
<b>jQuery</b>
имеет метод
<b>live()</b>
, который также можно использовать для регистрации динамических обработчиков событий. Метод
<b>live()</b>
устроен немного сложнее, чем метод
<b>delegate(),</b>
но он, как и метод
<b>bind(),</b>
имеет версии с двумя и тремя аргументами, которые чаще всего используются на практике. Два вызова метода
<b>delegate(),</b>
показанные выше, можно было бы заменить следующими вызовами метода
<b>live()</b>
:
<b>$("а").live("mouseover", linkHandler);</b>
<b>$("а", $(".dynamic")).live("mouseover”, linkHandler);</b>
Когда вызывается метод
<b>live(),</b>
элементы, находящиеся в объекте
<b>jQuery</b>
, в действительности никак не используются. Что имеет значение, так это строка селектора и объект контекста (первый и второй аргументы функции
<b>$()</b>
), использовавшиеся при создании объекта
<b>jQuery</b>
. Эти значения доступны в виде свойств selector и context объектов
<b>jQuery</b>
(раздел 19.1.2). Обычно функция
<b>$()</b>
вызывается с единственным аргументом, а роль контекста в этом случае играет текущий документ. То есть при использовании объекта х типа
<b>jQuery</b>
следующие две строки можно считать эквивалентными:
<b>х.live(type,handler);</b>
<b>$(x.context).delegate(x.selector, type, handler);</b>
Для удаления динамических обработчиков событий используются методы
<b>die()</b>
и
<b>undelegate().</b>
Метод
<b>die()</b>
может вызываться с одним или с двумя аргументами. Если методу передать единственный аргумент, определяющий тип события, он удалит все динамические обработчики событий, соответствующие селектору и типу событий. А если передать тип события и функцию обработчика, он удалит только указанный обработчик. Например: