События в JavaScript — обработка и модели

В этом руководстве вы узнаете о событиях JavaScript, моделях событий и о том, как обрабатывать события.

Событие — это действие, происходящее в веб-браузере, которое он возвращает, чтобы вы могли на него отреагировать.

Например, когда пользователи нажимают кнопку на веб-странице, вы можете отреагировать на это событием click, отобразив диалоговое окно.

Каждое событие может иметь обработчик события, представляющий собой блок кода, который будет выполняться при возникновении события.

Обработчик событий также известен как прослушиватель событий. Он прослушивает событие и выполняется, когда событие происходит.

Предположим, у вас есть кнопка с идентификатором btn :

<button id="btn">Click Me!</button>

Чтобы определить код, который будет выполняться при нажатии кнопки, вам необходимо зарегистрировать обработчик события с помощью addEventListener() :

let btn = document.querySelector('#btn');

function display() {
    alert('It was clicked!');
}

btn.addEventListener('click',display);

Как это работает.

  • Сначала выберите кнопку с идентификатором btn, используя метод querySelector().
  • Затем определите функцию display() в качестве обработчика событий.
  • Наконец, зарегистрируйте обработчик событий с помощью addEventListener(), чтобы при нажатии пользователем кнопки выполнялась функция display().

Более короткий способ зарегистрировать обработчик событий — поместить весь код в анонимную функцию, например:

let btn = document.querySelector('#btn');

btn.addEventListener('click',function() {
    alert('It was clicked!');
});

Поток событий

Предположим, что у вас есть следующий HTML-документ:

<!DOCTYPE html>
<html>
<head>
    <title>JS Event Demo</title>
</head>
<body>
    <div id="container">
        <button id='btn'>Click Me!</button>
    </div>
</body>

Когда вы нажимаете кнопку, вы нажимаете не только кнопку, но и контейнер кнопки, div и всю веб-страницу.

Поток событий объясняет порядок, в котором события получаются на странице от элемента, в котором происходит событие, и распространяются по дереву DOM.

Существуют две основные модели событий: всплывающее окно и захват событий.

Всплывающие события

В модели всплывающих событий событие начинается с наиболее специфичного элемента, а затем перемещается вверх к наименее специфичному элементу ( document или даже window ).

Когда вы нажимаете кнопку, событие click происходит в следующем порядке:

  1. кнопка
  2. div с контейнером id
  3. тело
  4. HTML
  5. документ

Событие click сначала происходит на кнопке, которая является элементом, который был нажат. Затем событие click идет вверх по дереву DOM, срабатывая на каждом узле на своем пути, пока не достигнет объекта document.

На следующем рисунке показан эффект всплывающей всплывающей подсказки, когда пользователи нажимают кнопку:

Всплывающие события JavaScript

Обратите внимание, что современные веб-браузеры поднимают событие до объекта window.

Захват событий

В модели захвата событий событие начинается с наименее специфичного элемента и течет вниз к наиболее специфичному элементу.

Когда вы нажимаете кнопку, событие click происходит в следующем порядке:

  1. документ
  2. HTML
  3. тело
  4. div с контейнером id
  5. кнопка

На следующем рисунке показан эффект захвата событий:

Захват событий JavaScript

Поток событий уровня 2 DOM

События уровня DOM 2 указывают, что поток событий состоит из трех фаз:

  • Сначала происходит захват события, что дает возможность перехватить событие.
  • Затем фактическая цель получает событие.
  • Наконец, происходит всплытие событий, что позволяет дать окончательный ответ на событие.

На следующем рисунке показана модель события DOM Level 2, когда пользователи нажимают кнопку:

Событие JavaScript DOM уровня 2

Объект Event

Когда происходит событие, веб-браузер передает объект Event обработчику события:

let btn = document.querySelector('#btn');

btn.addEventListener('click', function(event) {
    console.log(event.type);
});

Выход:

'click'

В следующей таблице показаны наиболее часто используемые свойства и методы объекта event :

Свойство/методОписание
bubblestrue, если событие всплывает
cancelabletrue, если поведение события по умолчанию можно отменить
currentTargetтекущий элемент, на котором срабатывает событие
defaultPreventedвернуть true, если была вызвана функция preventDefault().
detailбольше информации о мероприятии
eventPhase1 на фазу захвата, 2 на цель, 3 на  bubbling
preventDefault()отменить поведение по умолчанию для события. Этот метод эффективен только в том случае, если свойство cancelable имеет значение true.
stopPropagation()отмените любой дальнейший захват событий или всплывающую подсказку. Этот метод можно использовать только в том случае, если свойство bubbles равно true.
targetцелевой элемент события
typeтип события, которое было запущено

Обратите внимание, что объект event доступен только внутри обработчика событий. После выполнения всех обработчиков событий объект события автоматически уничтожается.

Метод preventDefault()

Чтобы предотвратить поведение события по умолчанию, используйте метод preventDefault().

Например, когда вы щелкаете ссылку, браузер перенаправляет вас на URL-адрес, указанный в атрибуте href :

<a href="https://www.javascripttutorial.net/">JS Tutorial</a>

Однако вы можете предотвратить такое поведение, используя метод preventDefault() объекта event :

let link = document.querySelector('a');

link.addEventListener('click',function(event) {
    console.log('clicked');
    event.preventDefault();
});

Обратите внимание, что метод preventDefault() не препятствует тому, чтобы событие всплыло в DOM. И событие может быть отменено, когда его свойство cancelable равно true.

Метод stopPropagation()

Метод stopPropagation() немедленно останавливает поток события через дерево DOM. Однако это не останавливает поведение браузера по умолчанию.

См. следующий пример:

let btn = document.querySelector('#btn');

btn.addEventListener('click', function(event) {
    console.log('The button was clicked!');
    event.stopPropagation();
});

document.body.addEventListener('click',function(event) {
    console.log('The body was clicked!');
});

Без stopPropagation() вы бы увидели два сообщения в окне консоли.

Однако событие click никогда не достигает body, поскольку в обработчике события click кнопки была вызвана stopPropagation().

Заключение

  • Событие — это действие, происходящее в веб-браузере, например щелчок мышью.
  • Поток событий имеет две основные модели: пузырьковое распространение событий и захват событий.
  • DOM Level 2 Event указывает, что поток событий состоит из трех фаз: всплывающая подсказка, событие происходит в определенном элементе и захват события.
  • Используйте addEventListener() для регистрации события, которое связывает событие с прослушивателем событий.
  • Объект event доступен только в прослушивателе событий.
  • Используйте preventDefault(), чтобы предотвратить поведение события по умолчанию, но не останавливать поток событий.
  • Используйте stopPropagation(), чтобы остановить поток события через дерево DOM, но он не отменяет поведение браузера по умолчанию
Рейтинг
( Пока оценок нет )
Александр Русаков / автор статьи
Программист, разработчик, 12 лет опыта работы в крупных компаниях. Быстро освоил typescript, делюсь своими знаниями на страницах этого сайта.
Загрузка ...
JavaScript и TypeScript