Перейти к содержимому

Обработка событий в DOM

Введение в события JavaScript

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

Распространённые события в JavaScript

Событие клика

Событие клика возникает, когда пользователь нажимает на элемент. Это одно из самых часто используемых событий.


html
<button id="clickButton">Click Me</button>

<script>
  document.getElementById("clickButton").addEventListener("click", function () {
    alert("Button was clicked!");
  });
</script>

В этом примере обработчик событий добавляется к кнопке с идентификатором clickButton. При клике на кнопку появится всплывающее окно с сообщением «Button was clicked!».

Событие наведения мыши

Событие mouseover возникает, когда курсор мыши перемещается над элементом.


html
<p id="mouseoverText">Hover over me!</p>

<script>
  document.getElementById("mouseoverText").addEventListener("mouseover", function () {
    this.style.color = "red";
  });
</script>

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

Событие нажатия клавиши

Событие keydown возникает, когда пользователь нажимает клавишу на клавиатуре.


html
<input type="text" id="inputField" placeholder="Type something..." />

<script>
  document.getElementById("inputField").addEventListener("keydown", function (event) {
    alert(`Key pressed: ${event.key}`);
    this.value = '';
  });
</script>

В этом примере обработчик событий добавляется к полю ввода с идентификатором inputField. При нажатии клавиши, пока поле ввода находится в фокусе, нажатая клавиша отображается во всплывающем окне.

Добавление обработчиков событий

Метод addEventListener()

Метод addEventListener() привязывает обработчик события к элементу, не перезаписывая существующие обработчики. Этот метод позволяет добавлять несколько обработчиков событий к одному элементу.


html
<button id="multiEventButton">Click or Hover</button>

<script>
  const button = document.getElementById("multiEventButton");

  button.addEventListener("click", function () {
    alert("Button clicked!");
  });

  button.addEventListener("mouseover", function () {
    button.style.backgroundColor = "lightblue";
  });
</script>

В этом примере к кнопке с идентификатором multiEventButton добавляются два обработчика событий. Один вызывает всплывающее окно при клике на кнопку, а другой меняет цвет фона кнопки при наведении курсора мыши.

INFO

Используйте addEventListener() для добавления нескольких обработчиков событий к одному элементу без перезаписи существующих.

Удаление обработчиков событий

Метод removeEventListener()

Метод removeEventListener() удаляет обработчик события, который был привязан с помощью addEventListener().


html
<button id="removeEventButton">Click Me</button>

<script>
  function showAlert() {
    alert("This will be removed after first click");
  }

  const button = document.getElementById("removeEventButton");
  button.addEventListener("click", showAlert);

  button.addEventListener("click", function () {
    button.removeEventListener("click", showAlert);
  });
</script>

В этом примере к кнопке с идентификатором removeEventButton добавляется обработчик событий, вызывающий всплывающее окно. Ещё один обработчик добавляется для удаления обработчика оповещения после первого клика. Обратите внимание, что removeEventListener требует ссылку на точно такой же объект функции, который использовался в addEventListener. Именно поэтому анонимные функции нельзя удалить позже — каждое объявление создаёт новый, отдельный объект функции.

INFO

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

Лучшие практики

Используйте делегирование событий

Добавьте один обработчик событий к родительскому элементу для управления событиями всех дочерних элементов. Это повышает производительность и уменьшает количество обработчиков событий.

Избегайте анонимных функций для обработчиков событий

Использование именованных функций для обработчиков событий упрощает их последующее удаление и повышает читаемость кода.

Очищайте обработчики событий

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

Минимизируйте количество обработчиков событий

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

Используйте опцию once в addEventListener

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

js
button.addEventListener("click", function handler() {
  console.log("Triggered once");
}, { once: true });

Предотвращайте действия по умолчанию и останавливайте всплытие событий целесообразно

Используйте event.preventDefault() и event.stopPropagation() осмотрительно, чтобы контролировать поведение событий, не мешая другим обработчикам.

Дебаунс или троттлинг обработчиков событий

Используйте техники дебаунса или троттлинга для оптимизации производительности обработчиков событий, которые срабатывают часто, например, события прокрутки или изменения размера.

Заключение

Освоение событий JavaScript имеет решающее значение для создания динамичных и интерактивных веб-приложений. Понимание того, как использовать такие события, как click, mouseover и keydown, а также как добавлять и удалять обработчики событий с помощью addEventListener() и removeEventListener(), позволит вам значительно улучшить взаимодействие пользователей с вашими веб-страницами.

Практика

Какие из следующих утверждений об обработке событий в DOM являются верными?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.