← Назад к вопросам

Что такое addEventListener?

1.6 Junior🔥 122 комментариев
#JavaScript Core

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое addEventListener?

addEventListener() — это метод, который позволяет регистрировать обработчики событий для элементов DOM. Это фундаментальный способ реагировать на взаимодействие пользователя с веб-страницей (клики, введение текста, прокрутка и т.д.).

Синтаксис

element.addEventListener(eventType, callback, options);

Параметры:

  • eventType (string) — тип события ("click", "input", "scroll", "keydown" и т.д.)
  • callback (function) — функция, которая выполнится при событии
  • options (object) — дополнительные опции

Базовые примеры

// Кнопка и её обработчик
const button = document.getElementById('myButton');

button.addEventListener('click', () => {
  console.log('Button clicked!');
});

// Входное поле
const input = document.getElementById('myInput');

input.addEventListener('input', (event) => {
  console.log('User typed:', event.target.value);
});

// Форма
const form = document.getElementById('myForm');

form.addEventListener('submit', (event) => {
  event.preventDefault(); // Предотвратить стандартную отправку
  console.log('Form submitted');
});

Объект Event

Любой обработчик события получает объект Event с информацией:

button.addEventListener('click', (event) => {
  console.log('Event type:', event.type);           // 'click'
  console.log('Target element:', event.target);     // элемент, на котором произошло событие
  console.log('Current target:', event.currentTarget); // элемент с обработчиком
  console.log('Timestamp:', event.timeStamp);       // время события
  
  // Позиция мыши
  console.log('Mouse X:', event.clientX);
  console.log('Mouse Y:', event.clientY);
});

Распространение событий (Event Bubbling)

События распространяются от элемента вверх по DOM дереву:

<div id="parent">
  <button id="child">Click me</button>
</div>
const parent = document.getElementById('parent');
const child = document.getElementById('child');

// Обработчик дочернего элемента
child.addEventListener('click', (event) => {
  console.log('Child clicked');
});

// Обработчик родительского элемента
parent.addEventListener('click', (event) => {
  console.log('Parent clicked');
  // Сработает, когда кликнули на child (bubbling!)
});

// При клике на button:
// 1. Выполнится обработчик child
// 2. Потом выполнится обработчик parent
// Консоль покажет:
// "Child clicked"
// "Parent clicked"

Управление распространением

const button = document.getElementById('myButton');
const parent = document.getElementById('parent');

button.addEventListener('click', (event) => {
  console.log('Button clicked');
  
  // Остановить распространение события
  event.stopPropagation();
  // Обработчик parent не сработает
});

parent.addEventListener('click', () => {
  console.log('Parent clicked'); // Не выполнится
});

// Также можно предотвратить стандартное поведение
button.addEventListener('click', (event) => {
  event.preventDefault(); // Отменить стандартное действие
});

Использование capture

По умолчанию события обрабатываются в фазе bubbling (снизу вверх). Можно слушать в фазе capture (сверху вниз):

const parent = document.getElementById('parent');
const child = document.getElementById('child');

// Capture фаза (true) - обработчик родителя сработает первым
parent.addEventListener('click', () => {
  console.log('Parent (capture)');
}, true); // true = capture phase

// Bubble фаза (false или отсутствует) - стандартный порядок
child.addEventListener('click', () => {
  console.log('Child');
}, false); // false = bubbling phase (по умолчанию)

// При клике на child:
// Порядок: "Parent (capture)" -> "Child"

Различные типы событий

const element = document.getElementById('myElement');

// События мыши
element.addEventListener('click', handler);     // Клик левой кнопкой
element.addEventListener('dblclick', handler);  // Двойной клик
element.addEventListener('mousedown', handler); // Зажата кнопка
element.addEventListener('mouseup', handler);   // Отпущена кнопка
element.addEventListener('mousemove', handler); // Движение мыши
element.addEventListener('mouseover', handler); // Наведение на элемент
element.addEventListener('mouseout', handler);  // Уход с элемента

// События клавиатуры
element.addEventListener('keydown', handler);   // Нажата клавиша
element.addEventListener('keyup', handler);     // Отпущена клавиша
element.addEventListener('keypress', handler);  // Напечатан символ

// События формы
element.addEventListener('input', handler);     // Ввод в input/textarea
element.addEventListener('change', handler);    // Изменение значения
element.addEventListener('focus', handler);     // Фокус на элемент
element.addEventListener('blur', handler);      // Потеря фокуса
element.addEventListener('submit', handler);    // Отправка формы

// События страницы
window.addEventListener('scroll', handler);     // Прокрутка
window.addEventListener('resize', handler);     // Изменение размера
window.addEventListener('load', handler);       // Страница загружена
window.addEventListener('unload', handler);     // Страница выгружается

Особенности keydown и keyup

const input = document.getElementById('myInput');

input.addEventListener('keydown', (event) => {
  console.log('Key pressed:', event.key);        // Нажатая клавиша
  console.log('Key code:', event.code);          // Код клавиши
  console.log('Is Shift pressed:', event.shiftKey);
  console.log('Is Ctrl pressed:', event.ctrlKey);
  
  // Проверка конкретной клавиши
  if (event.key === 'Enter') {
    console.log('Enter pressed');
  }
  
  // Проверка комбинации
  if (event.ctrlKey && event.key === 's') {
    event.preventDefault();
    console.log('Ctrl+S pressed');
  }
});

Удаление обработчика (важно!)

// Если нужно удалить обработчик, сохрани ссылку на функцию
const handleClick = () => {
  console.log('Clicked');
};

const button = document.getElementById('myButton');

// Добавить
button.addEventListener('click', handleClick);

// Позже удалить
button.removeEventListener('click', handleClick);

// ❌ Так НЕ работает (анонимная функция)
button.addEventListener('click', () => {
  console.log('Clicked');
});
// button.removeEventListener('click', () => {...}); // Не удалит!

Слушание событий один раз

const button = document.getElementById('myButton');

// Опция: once: true
button.addEventListener('click', (event) => {
  console.log('Clicked once');
}, { once: true });

// При первом клике обработчик сработает и автоматически удалится

Практический пример: форма с валидацией

const form = document.getElementById('myForm');
const emailInput = document.getElementById('email');
const passwordInput = document.getElementById('password');
const submitButton = document.getElementById('submit');

// Валидация email
emailInput.addEventListener('input', (event) => {
  const email = event.target.value;
  const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
  
  if (isValid) {
    event.target.classList.remove('error');
    event.target.classList.add('success');
  } else {
    event.target.classList.add('error');
    event.target.classList.remove('success');
  }
});

// Проверка пароля
passwordInput.addEventListener('input', (event) => {
  const password = event.target.value;
  submitButton.disabled = password.length < 8;
});

// Отправка формы
form.addEventListener('submit', (event) => {
  event.preventDefault();
  
  const email = emailInput.value;
  const password = passwordInput.value;
  
  console.log('Form data:', { email, password });
  // Отправить на сервер
  fetch('/api/login', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ email, password })
  });
});

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

// Вместо добавления обработчика к каждому элементу,
// слушай событие на родителе

const list = document.getElementById('myList');

list.addEventListener('click', (event) => {
  if (event.target.tagName === 'LI') {
    console.log('Clicked item:', event.target.textContent);
  }
});

// Теперь любой новый <li> добавленный в список
// будет автоматически реагировать на клик

Итоги

  • addEventListener() регистрирует обработчики событий
  • Event объект содержит информацию о событии
  • Event bubbling — события распространяются вверх по DOM
  • Используй event.preventDefault() для отмены стандартного поведения
  • Используй event.stopPropagation() для остановки распространения
  • Всегда удаляй обработчики через removeEventListener() чтобы избежать утечек памяти
  • Делегирование событий эффективнее, чем обработчики на каждом элементе
Что такое addEventListener? | PrepBro