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

19.4.6. Возбуждение событий

19.4.6. Возбуждение событий

Зарегистрированные обработчики событий будут вызываться автоматически, когда пользователь начнет использовать мышь или клавиатуру или когда будут возникать события других типов. Однако иногда бывает полезно генерировать события вручную. Проще всего сделать это, вызвав один из простых методов регистрации обработчиков (такой как click() или mouseover()) без аргументов. Подобно многим методам объекта jQuery, которые могут играть роль методов чтения и записи, эти методы регистрируют обработчики событий, когда вызываются с аргументами, и запускают их, когда вызываются без аргументов. Например:

$("#my_form").submit(); // Будет действовать, как если бы пользователь щелкнул
                        // на кнопке отправки формы

Метод submit() в инструкции выше синтезирует объект Event и запустит все обработчики событий, которые были зарегистрированы для события «submit». Если ни один из этих обработчиков не вернет false или не вызовет метод preventDefault() объекта Event, форма действительно будет отправлена. Обратите внимание, что события будут всплывать, даже если сгенерировать их вручную, как в данном примере. Это означает, что возбуждение события в множестве выбранных элементов может также привести к вызову обработчиков событий в предках этих элементов.

Важно отметить, что методы объекта jQuery, генерирующие события, будут запускать любые обработчики событий, зарегистрированные методами объекта jQuery, а также обработчики, объявленные в HTML-атрибутах или свойствах объектов Element, таких как onsubmit. Но с их помощью невозможно вручную запустить обработчики событий, зарегистрированные методом addEventListener() или attachEvent() (однако эти обработчики по-прежнему будут вызываться при возникновении настоящих событий).

Отметьте также, что механизм возбуждения событий в библиотеке jQuery является синхронным - в нем не используется очередь событий. Когда событие генерируется вручную, обработчики событий будут вызваны немедленно, до того как метод, возбудивший событие, вернет управление. Если вы генерируете событие «click» и один из запущенных обработчиков сгенерирует событие «submit», все обработчики события «submit» будут вызваны до того, как будет вызван следующий обработчик события «click».

Методы, такие как submit(), удобно использовать для связывания и возбуждения событий; но как библиотека jQuery определяет более обобщенный метод bind(), так же она определяет и более обобщенный метод trigger(). Обычно при вызове в первом аргументе методу trigger() передается строка с типом события, и он запускает обработчики, зарегистрированные для этого типа во всех выбранных элементах в объекте jQuery. То есть вызов submit() в примере выше эквивалентен вызову:

$("#my_form").trigger("submit");

В отличие от методов bind() и unbind(), в вызове метода trigger() нельзя указать более одного типа события в первом аргументе. Однако, подобно методам bind() и unbind(), он позволяет указывать пространства имен возбуждаемых событий» чтобы запустить только обработчики, зарегистрированные для этого пространства имен. Если потребуется запустить только обработчики событий, не привязанные ни к какому пространству имен, следует добавить в строку с типом события восклицательный знак. Обработчики, зарегистрированные посредством свойств, таких как onclick, считаются обработчиками, не привязанными к какому-либо пространству имен:

$("button").trigger("click.ns1"); // Запустит обработчики в пространстве имен
$("button").trigger("click!"); // Запустит обработчики, не привязанные
// к какому-либо пространству имен

Вместо строки с типом события в первом аргументе методу trigger() можно передать объект Event (или любой другой объект, имеющий свойство type). Свойство type будет определять, какие обработчики должны запускаться. Если передать объект Event библиотеки jQuery, этот объект будет передан обработчикам. Если передать простой объект, автоматически будет создан новый объект Event библиотеки jQuery и в него будут добавлены свойства объекта, переданного методу. Это самый простой способ передать обработчикам событий дополнительные данные:

// Обработчик onclick элемента buttonl генерирует то же событие для button2
$('flbuttonl').click(function(e) { $('flbutton2').trigger(e); });
// Добавит дополнительные свойства в объект события при возбуждении события
$('flbuttonl').trigger({type: 'click', synthetic:true});
// Этот обработчик проверяет дополнительные свойства, чтобы отличить
// настоящее событие от искусственного
$('flbuttonl').click(function(e) { if (е.synthetic) (...) }):

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

$('flbuttonl').trigger("click", true); // Передать единственный дополнительный аргумент
$('flbuttonl').trigger("click", [х,у,z]); // Передать три дополнительных аргумента

Иногда может потребоваться запустить все обработчики события данного типа, независимо от того, к какому элементу документа они привязаны. Для этого можно выбрать все элементы вызовом $('*') и вызвать метод trigger() относительно результата, но это решение весьма неэффективно. Вместо того чтобы возбуждать событие в глобальном масштабе, можно вызвать вспомогательную функцию jQuery.event.trigger(). Эта функция принимает те же аргументы, что и метод trigger(), и эффективно запускает обработчики событий указанного типа, имеющиеся во всем документе. Обратите внимание, что «глобальные события», возбуждаемые таким способом, не всплывают, и при этом запускаются только обработчики событий, зарегистрированные с использованием методов объекта jQuery (обработчики, зарегистрированные с помощью свойств модели DOM, не запускаются).

После вызова обработчиков событий метод trigger() (и вспомогательные методы, вызывающие его) выполняет действия, предусмотренные по умолчанию для сгенерированного типа события (предполагается, что ни один обработчик не вернул значение false или не вызвал метод preventDefault() объекта события). Например, если возбудить событие «submit» в элементе <form>, метод trigger() вызовет метод submit() этой формы, а если возбудить в элементе событие «focus», метод trigger() вызовет метод focus() этого элемента.

Если необходимо вызвать обработчики событий без выполнения действий по умолчанию, вместо метода trigger() следует использовать метод triggerHandler(). Этот метод действует точно так же, как и метод trigger(), за исключением того, что он сначала вызывает методы preventDefault() и cancelBubble() объекта Event. Это означает, что искусственное событие не будет всплывать, и для него не будут выполняться действия, предусмотренные по умолчанию.

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


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