Создание и запуск событий
Создание события
События на странице могут запускаться не только браузером или посетителем сайта, но и самим скриптом. Для этого предварительно необходимо создать объект события, который будет передаваться обработчику. Делается это с помощью объекта-конструктора Event
.
new Event(имя_события[, свойства])
- имя_события
-
Указывается название события в кавычках.
Можно использовать не только стандартные события, но и придумывать свои собственные (тогда обработчик назначается с помощью методаaddEventListener()
). - свойства
-
Необязательный аргумент. Должен быть объектом с двумя свойствами:
bubbles
- всплывать ли событию (true
/false
).cancelable
- возможность отмены действий браузера по умолчанию (true
/false
).
По умолчанию:{bubbles: false, cancelable: false}
.
Запуск события
Чтобы сгенерировать событие на элементе, используется метод dispatchEvent()
.
element.dispatchEvent(объект_события)
- объект_события
- Ссылка на специально созданный объект события. Данный объект будет передан обработчикам события.
Всплытие при генерации события
Вызов dispatchEvent()
приводит к выполнению обработчиков события в соответствующем порядке. Правила обработки события браузером (погружение и всплытие) сохраняются. Но для всплытия события необходимо указать свойство
при создании объекта события.bubbles: true
<html> <head> <title>События</title> </head> <body onclick="alert('Событие click всплывает.');"> <p>Параграф</p> </body> </html> <script> var par = document.body.firstElementChild; var event = new Event('click', {bubbles: true}); par.dispatchEvent(event); /* вызов 'click' на параграфе */ </script>
В примере вызывается событие click
на параграфе и оно всплывает.
Действия браузера при генерации события
Метод dispatchEvent()
возвращает значение false
, если хотя бы один из выполняемых обработчиков вызывает event.preventDefault()
(при создании объекта события должно быть указано свойство
). В остальных случаях возвращается cancelable: true
true
.
<html> <head> <title>События</title> </head> <body> <input type="button" onclick="event.preventDefault();" value="Кнопка"> </body> </html> <script> var button = document.body.firstElementChild; var event_1 = new Event('click', {cancelable: true}); alert(button.dispatchEvent(event_1)); /* false, действие отменено */ var event_2 = new Event('click', {cancelable: false}); alert(button.dispatchEvent(event_2)); /* true, действие не отменено */ </script>
Если вызывается стандартное событие (click
и т.п.), тогда данная возможность позволяет узнать, было ли отменено действие браузера по умолчанию.
Генерация нестандартных событий
В случае с нестандартными событиями вызов event.preventDefault()
позволяет получить дополнительную информацию от обработчика события.
Ниже приведён пример, в котором элементу <input>
назначен обработчик нестандартного события check_value
для проверки введённого значения:
<html> <head> <title>События</title> </head> <body> <input type="text" oninput="mess(); this.value='';" placeholder="Введите цифру 5"> </body> </html> <script> var input = document.body.firstElementChild; input.addEventListener('check_value', function(event) { if (this.value !== '5') { event.preventDefault(); } }); function mess() { var check_event = new Event('check_value', {cancelable: true}); if (input.dispatchEvent(check_event) == true) { alert('Поздравляем. Вы ввели цифру 5.'); } else { alert('Введите цифру 5.'); } } </script>
При вводе любого символа в текстовое поле запускается функция mess()
. В ней генерируется событие check_value
для проверки значения. В зависимости от результата выполнения обработчика события check_value
выводится нужное сообщение.
Область применения
Генерация событий в скрипте используется редко. Это вполне логично, ведь обработчики событий должны реагировать на действия, совершённые пользователем или браузером. А для выполнения команд, не связанных с этими действиями, можно использовать простые функции. Однако, есть случаи, когда генерация событий может пригодиться.
Можно выделить два основных случая для генерации событий в скрипте:
- Генерация стандартных событий с целью проверки работоспособности кода. Например, когда необходимо проверить реакцию скрипта на многократные действия пользователя. Или когда запуск программы осуществляется сложной комбинацией событий, а тестирование надо провести много раз.
- Генерация собственных (нестандартных) событий для улучшения прозрачности кода. Например, изменение на странице сайта (раскрытие подменю, добавление товара в корзину и т.п.), выполненное скриптом, может восприниматься и как определённое событие. Запуск события (а не функции) в таком случае более понятен, особенно если такое событие в свою очередь приводит к выполнению определённых действий (затемнение фона при раскрытии подменю, анимация добавления в корзину и т.п.).