JavaScript. Подробное руководство, 6-е издание, стр. 310

<b>  window.location = &quot;logoff.php&quot;; // Перейти на другую страницу</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>&lt;а&gt;,</b>
имеющимся в документе, и затем создадим новые элементы
<b>&lt;а&gt;,</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>&lt;а&gt;,</b>
можно зарегистрировать обработчик, как показано ниже:

<b>$(document).delegate(&quot;a&quot;, &quot;mouseover&quot;, linkHandler);</b>

Или сначала применить метод

<b>bind()</b>
к статической части документа, а затем с помощью метода
<b>delegate()</b>
обработать динамически изменяемую часть:

<b>// Статические обработчики событий для статических ссылок </b>

<b>$(&quot;а&quot;).bind(&quot;mouseover&quot;, linkHandler);</b>

<b>// Динамические обработчики событий для фрагментов документа,</b>

<b>// которые изменяются динамически</b>

<b>S(&quot;.dynamic&quot;).delegate(&quot;a&quot;, &quot;mouseover&quot;, 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>$(&quot;а&quot;).live(&quot;mouseover&quot;, linkHandler);</b>

<b>$(&quot;а&quot;, $(&quot;.dynamic&quot;)).live(&quot;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>
может вызываться с одним или с двумя аргументами. Если методу передать единственный аргумент, определяющий тип события, он удалит все динамические обработчики событий, соответствующие селектору и типу событий. А если передать тип события и функцию обработчика, он удалит только указанный обработчик. Например: