События
Last updated
Last updated
Событие – это сигнал от браузера о том, что что-то произошло. События используются для реакции на действия посетителя и исполнения кода. Cобытия становятся в очередь и обрабатываются в порядке поступления, асинхронно, независимо.
Существует много видов событий, рассмотрим некоторые из них.
click
- происходит, когда кликнули на элемент левой кнопкой мыши
submit
- посетитель отправил форму
focus
- посетитель фокусируется на элементе, например нажимает на input
keydown
- посетитель нажимает клавишу
Одно действие может вызывать несколько событий. Например клик вызывает сначала mousedown
, а затем mouseup
и click
. В тех случаях, когда одно действие генерирует несколько событий, их порядок фиксирован. То есть, обработчики вызовутся в порядке mousedown → mouseup → click
.
Каждое событие обрабатывается независимо. Например при клике, события mouseup
и click
возникают одновременно, но обрабатываются последовательно. Сначала полностью завершается обработка mouseup, затем запускается click
.
Для того, чтобы элемент реагировал на действия пользователя, на него необходимо повесить слушателя (обработчик) события. То есть функцию, которая сработает, как только событие произошло. Именно благодаря слушателям событий, скрипт может реагировать на действия пользователя.
Методы elem.addEventListener()
и elem.removeEventListener()
- это современный способ назначить или удалить обработчик, при этом можно использовать сколько угодно обработчиков на одном типе события.
Добавляет слушателя события на элемент.
event
- имя события, строка, например click
handler
- ссылка на функцию, которую надо поставить обработчиком
phase
- необязательный аргумент, фаза, на которой обработчик должен сработать. Указывается крайне редко.
Если мы передаем функцию, которая использует this
, по умолчанию this
внутри нее будет ссылаться на сам DOM-узел на котором висит слушатель. Не забывайте привязывать контекст используя метод bind
.
Удаляет слушателя. Аргументы те же, что у addEventListener
.
Для удаления нужно передать ссылку именно на ту функцию-обработчик, которая была назначена в addEventListener
. Поэтому для callback
используют отдельную функцию и передают ее по имени.
Чтобы обработать событие, недостаточно знать о том, что это клик или нажатие клавиши. Могут понадобиться детали: текущее значение текстового поля, элемент, на котором произошло событие, встроенные методы и другое. Объект события содержит ценную информацию о деталях события и автоматически передается первым аргументом в обработчик события.
Некоторые свойства объекта события:
event.type
- тип события
event.target
- элемент, на котором произошло событие
event.currentTarget
- элемент, на котором сработал обработчик
Некоторые события автоматически вызывают действие браузера, встроенное по умолчанию как реакция на определенный тип события: переход по ссылке, отправка формы и т. п. Как правило их можно, и зачастую нужно, отменить.
Например:
Клик по ссылке инициирует переход на новый URL, указанный в href
ссылки.
Отправка формы — перезагрузку страницы.
Для отмены действия браузера по умолчанию на объекте события есть стандартный метод.
Возникает при отправке формы. Его применяют для валидации (проверки) формы перед отправкой. Чтобы отправить форму у посетителя есть два способа:
Нажать кнопку с type="submit"
Нажать клавишу Enter
, находясь в каком-нибудь поле формы
Какой бы способ ни выбрал посетитель – будет сгенерировано событие submit
. В обработчике этого события можно проверить данные и выполнить действия по результатам проверки.
Есть три основных события клавиатуры: keydown
, keypress
и keyup
. При нажатии клавиши сначала происходит keydown
, после чего keypress
и только потом keyup
, когда клавишу отжали.
События keydown
и keyup
срабатывают при нажатии любой клавиши, включая служебные. А вот keypress
срабатывает, только если нажата символьная клавиша, т. е. нажатие приводит к появлению символа. Управляющие клавиши, такие как Ctrl
, Shift
, Alt
и другие, не генерируют событие keypress
.
Свойство KeyboardEvent.key
доступно для чтения и возвращает значение клавиши, нажатой пользователем, принимая во внимание состояние клавиш модификаторов, таких как shiftKey
, а так же текущий язык и модель клавиатуры.
Свойство KeyboardEvent.code
представляет собой физическую клавишу на клавиатуре (в отличие от символа, сгенерированного нажатием клавиши). Другими словами, это свойство возвращает значение, которое не изменяется с помощью раскладки клавиатуры или состояния клавиш-модификаторов.
Поставьте фокус в окно примера, кликнув в него мышкой, отслеживание событий клавиатуры стоит на элементе window
. Вводите символы на клавиатуре и результат будет отображаться в списке.
Элемент получает фокус при нажатии на нем мышкой, клавиши Tab
или выбрав на планшете. Момент получения фокуса и потери очень важен, при получении фокуса мы можем подгрузить данные для автозаполнения, начать отслеживать изменения. При потере фокуса — проверить введенные данные.
При фокусировке на элемент происходит событие focus
, а когда фокус исчезает, например посетитель кликает в другом месте экрана, происходит событие blur
.
По умолчанию многие элементы не могут получить фокус. Например, если кликнуть по div
, то фокусировка на нем не произойдет. Кстати, фокус может быть только на одном элементе в единицу времени и текущий элемент, на котором фокус, доступен как document.activeElement
.
Активировать или отменить фокус можно программно, вызвав в коде одноименные методы elem.focus()
и elem.blur()
у элемента.
Происходит по окончании изменения элемента формы, когда изменение зафиксировано. Для input:text
или textarea
событие произойдёт не при каждом вводе, а при потере фокуса, что не всегда удобно.
Например пока вы набираете что-то в текстовом поле — события нет. Но как только фокус пропал, произойдет событие change
. Для остальных же элементов, например select
, input:checkbox
и input:radio
, оно срабатывает сразу при выборе значения.
Срабатывает только на текстовых элементах, input:text
и textarea
, при изменении значения элемента. Не ждет потери фокуса, в отличие от change
.
В современных браузерах input
— самое главное событие для работы с текстовым элементом формы. Именно его, а не keydown
или keypress
, следует использовать.
При открытии веб-страницы, процесс загрузки HTML-документа условно состоит из трёх стадий. На каждую можно повесить обработчик, чтобы совершить действия.
DOMContentLoaded
— браузер полностью загрузил HTML и построил DOM-дерево.
load
— браузер загрузил все ресурсы.
beforeunload
и unload
— уход со страницы.
Происходит на document
когда все DOM-элементы разметки уже созданы, можно их искать, вешать обработчики, создавать интерфейс, но при этом, возможно, ещё не догрузились какие-то картинки или стили.
Если в документе есть теги script
, то браузер обязан их выполнить до того, как построит DOM. Поэтому событие DOMContentLoaded
ждёт загрузки и выполнения таких скриптов. Исключением являются скрипты с атрибутами async
и defer
, которые подгружаются асинхронно. Внешние файлы стилей никак не влияют на событие DOMContentLoaded
.
Событие срабатывает на window
, когда загружается вся страница, включая ресурсы на ней — стили, картинки и т.д. Его используют редко, поскольку обычно нет нужды ждать загрузки всех ресурсов.
Когда человек уходит со страницы или закрывает окно, на window
срабатывает событие unload
. В нём можно сделать что-то, не требующее ожидания, например закрыть вспомогательные popup-окна, но отменить сам переход нельзя. Событие почти не используется — мало что можно сделать зная, что вкладка браузера сейчас закроется.
Событие срабатывает на window
. Это стандарт для того, чтобы проверить, сохранил ли посетитель данные, действительно ли он хочет покинуть страницу.
Если посетитель инициировал переход на другую страницу или нажал закрыть окно, то обработчик beforeunload
может приостановить процесс и спросить подтверждение. Для этого ему нужно вернуть строку, которую браузеры покажут посетителю, спрашивая – нужно ли переходить.