2. Обработка событий


События — это сигналы от браузера о том, что что-то произошло (клик мыши, нажатие клавиши, загрузка страницы и т.д.). JavaScript может "прослушивать" эти события и выполнять код в ответ.

Основы addEventListener

Метод addEventListener регистрирует обработчик для указанного события на элементе.

element.addEventListener(event, handler, [options]);
  • event — строка с названием события (например, 'click', 'submit').
  • handler — функция, которая будет вызвана при наступлении события.
  • options — необязательный объект или булево значение (см. ниже).
const button = document.getElementById('myButton');

function handleClick() {
    alert('Кнопка нажата!');
}

button.addEventListener('click', handleClick);

Удаление обработчика

Если обработчик больше не нужен, его можно удалить методом removeEventListener. При этом передаётся та же самая функция (не анонимная).

button.removeEventListener('click', handleClick);

Объект события

Когда происходит событие, браузер создаёт объект события с деталями и передаёт его первым аргументом в обработчик.

element.addEventListener('click', function(event) {
    console.log(event); // Объект MouseEvent для клика
});

Основные свойства и методы объекта event:

  • event.type — тип события (например, 'click').
  • event.target — элемент, на котором произошло событие (может быть дочерним).
  • event.currentTarget — элемент, на котором сработал обработчик (обычно тот, к которому привязан слушатель).
  • event.preventDefault() — отменяет действие по умолчанию (например, переход по ссылке или отправку формы).
  • event.stopPropagation() — предотвращает всплытие события (останавливает его распространение по DOM).
  • event.stopImmediatePropagation() — предотвращает всплытие и вызов других обработчиков на том же элементе.
const link = document.querySelector('a');
link.addEventListener('click', function(event) {
    event.preventDefault(); // ссылка не перейдёт по адресу
    console.log('Клик по ссылке, но переход отменён');
});

Фазы события: всплытие и перехват

События в DOM проходят три фазы:

  • Фаза перехвата (capturing) — событие идёт от window вниз к целевому элементу.
  • Фаза цели (target) — событие достигло целевого элемента.
  • Фаза всплытия (bubbling) — событие поднимается от целевого элемента вверх к window.

По умолчанию обработчики срабатывают на фазе всплытия. Чтобы повесить обработчик на фазу перехвата, нужно передать true или { capture: true } в третьем аргументе.

// Фаза всплытия (по умолчанию)
parent.addEventListener('click', () => console.log('parent (bubble)'));
child.addEventListener('click', () => console.log('child (bubble)'));

// Фаза перехвата
parent.addEventListener('click', () => console.log('parent (capture)'), true);
child.addEventListener('click', () => console.log('child (capture)'), true);

// При клике на child порядок:
// parent (capture) -> child (capture) -> child (bubble) -> parent (bubble)

Опции addEventListener

Третий аргумент может быть объектом с полями:

  • capture: true — обработчик сработает на фазе перехвата (аналог true).
  • once: true — обработчик вызовется только один раз, затем автоматически удалится.
  • passive: true — указывает, что обработчик не вызовет preventDefault(). Это улучшает производительность при скролле.
// Обработчик сработает только один раз
button.addEventListener('click', () => {
    console.log('Это сообщение появится только один раз');
}, { once: true });

// Пассивный обработчик для событий прокрутки (не блокирует скролл)
window.addEventListener('touchstart', () => {
    // не вызываем preventDefault
}, { passive: true });

Популярные типы событий

События мыши

  • click — клик (нажатие и отпускание).
  • dblclick — двойной клик.
  • mousedown / mouseup — нажатие / отпускание кнопки мыши.
  • mousemove — движение мыши.
  • mouseover / mouseout — наведение на элемент / уход с элемента (всплывают).
  • mouseenter / mouseleave — наведение / уход (не всплывают, более удобны для попапов).

События клавиатуры

  • keydown — нажатие клавиши.
  • keyup — отпускание клавиши.
  • keypress — устаревшее, используйте keydown.

В объекте события клавиатуры доступны event.key (строка с символом), event.code (физический код клавиши) и флаги ctrlKey, shiftKey, altKey.

document.addEventListener('keydown', function(event) {
    if (event.key === 'Escape') {
        console.log('Нажали ESC');
    }
});

События полей ввода

  • input — срабатывает при каждом изменении значения (ввод, вставка, удаление).
  • change — срабатывает после потери фокуса, если значение изменилось.
  • focus — получение фокуса.
  • blur — потеря фокуса.

События форм

  • submit — отправка формы. Важно вызвать event.preventDefault() для отмены отправки.
const form = document.getElementById('myForm');
form.addEventListener('submit', function(event) {
    event.preventDefault();
    // Валидация или отправка через fetch
});

События документа/окна

  • DOMContentLoaded — HTML загружен и построен DOM (не ждёт картинки и стили).
  • load — страница полностью загружена (включая ресурсы).
  • resize — изменение размера окна.
  • scroll — прокрутка.
document.addEventListener('DOMContentLoaded', function() {
    console.log('DOM готов! Можно искать элементы.');
});