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

19.4.4. Дополнительные способы регистрации обработчиков событий

19.4.4. Дополнительные способы регистрации обработчиков событий

Мы уже знаем, что в библиотеке jQuery имеется множество простых методов регистрации обработчиков событий. Внутри каждого из них вызывает один и тот же, более сложный метод bind(), который связывает обработчик с указанным типом события во всех элементах в объекте jQuery. Прямое использование метода bind() позволяет использовать дополнительные возможности механизма регистрации, недоступные в простых методах.[55](

В библиотеке jQuery термин «связывание» используется для обозначения регистрации обработчиков событий. Стандарт ECMAScript 5 и многие фреймворки на языке JavaScript определяют в объектах функций метод bind() (раздел 8.7.4) и используют этот термин для обозначения связи функций с объектами, относительно которых они вызываются. Версия метода Function. bind() в библиотеке jQuery является вспомогательной функцией с именем jQuery. ргоху(), которая описывается в разделе 19.7.

В простейшем случае методу bind() передаются строка с типом события в первом аргументе и функция обработчика события во втором. Простые методы регистрации обработчиков событий используют именно эту форму вызова метода bind(). Вызов $('р').click(f), например, эквивалентен вызову:

$('р').bind('click',f);

Метод bind() может также вызываться с тремя аргументами. В этой форме вызова тип события передается в первом аргументе, а функция обработчика - в третьем. Во втором аргументе можно передать любое значение, и библиотека jQuery будет присваивать это значение свойству data объекта Event перед вызовом обработчика. Иногда это может пригодиться для передачи обработчику дополнительных данных без использования замыкания.

Кроме того, метод bind() обладает еще одной дополнительной особенностью. Если в первом аргументе передать список типов событий, разделенных пробелами, то функция обработчика будет зарегистрирована для всех указанных типов событий. Вызов $('a').hover(f) (раздел 19.4.1), например, эквивалентен вызову:

$('а').bind('mouseenter mouseleave', f);

Еще одной важной особенностью метода bind() является возможность указать при регистрации пространство (или пространства) имен для обработчиков событий. Это дает возможность определить группу обработчиков событий, что может пригодиться, когда позднее потребуется переключать или удалять обработчики из определенного пространства имен. Поддержка пространств имен для обработчиков особенно удобна для тех, кто пишет библиотеки или модули, использующие библиотеку jQuery. Пространства имен событий подобны селекторам CSS-классов. Чтобы связать обработчик события с определенным пространством имен, добавьте точку и имя пространства имен после типа события:

// Связать f, как обработчик события mouseover в пространстве имен "myMod"
// ко всем элементам <а>
$('а').bind('mouseover.myMod', f);

Имеется даже возможность связать обработчик с несколькими пространствами имен, например:

// Связать f, как обработчик события mouseout в пространствах имен "myMod" и "yourMod"
$('a').bind('mouseout.myMod.yourMod', f);

Последней особенностью метода bind() является возможность передать ему в первом аргументе объект, отображающий имена событий в функции обработчиков. Возьмем еще раз в качестве примера метод hover().Вызов $("a").hover(f,g) эквивалентен вызову:

$('а').bind({mouseenter:f, mouseleave:g});

При использовании этой формы метода bind() именами свойств передаваемого ему объекта могут быть строки со списками типов событий, разделенных запятыми, включающими пространства имен. Если в этом случае передать второй аргумент, его значение будет использоваться как дополнительные данные для всех связанных обработчиков.

Библиотека jQuery имеет еще один метод регистрации обработчиков. Метод опе() вызывается и действует подобно методу bind(), за исключением того, что зарегистрированный с его помощью обработчик события автоматически удаляется после первого вызова. То есть, как следует из имени метода, обработчики событий, зарегистрированные с помощью опе(), никогда не вызываются более одного раза.

Единственное, чем не обладают методы bind() и опе(), - это возможность регистрации перехватывающих обработчиков событий, которая поддерживается методом addEventListener() (раздел 17.2.3). IE (до версии IE9) не поддерживает перехватывающие обработчики, и библиотека jQuery не пытается имитировать эту особенность.

Оглавление книги


Генерация: 1.531. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз