JavaRush /Курсы /Модуль 1: Web Core /Объект события: event.targ...

Объект события: event.target, event.type, event.preventDefault

Модуль 1: Web Core
23 уровень , 3 лекция
Открыта

1. Что такое объект события в JavaScript

Когда в браузере происходит событие (например, пользователь кликает по кнопке), JavaScript вызывает вашу функцию-обработчик и передаёт ей специальный объект — объект события (обычно его называют event, но имя переменной может быть любым). Этот объект содержит всю информацию о произошедшем событии: кто его вызвал, какой был тип события, дополнительные данные (например, координаты мыши, если это клик), и даже методы для управления поведением браузера.

Вот базовый пример:

<button id="myBtn">Нажми меня!</button>
<script>
  document.getElementById('myBtn').addEventListener('click', function(event) {
    console.log(event); // Здесь мы увидим объект события!
  });
</script>

Когда вы нажимаете на кнопку, в консоль выводится огромный объект — это и есть event.

Почему это важно?

Без объекта события вы бы вообще не знали, кто именно вызвал обработчик, что за событие произошло и где. Это примерно как если бы вы пришли на вечеринку, а вам не сказали, кто вас позвал, где вы находитесь и почему вообще тут собрались. Неудобно, правда?

2. event.target: кто вызвал событие?

Самое первое и, пожалуй, самое полезное свойство объекта события — это event.target.

event.target — это ссылка на тот DOM-элемент, на котором непосредственно произошло событие. То есть, если пользователь кликнул по кнопке, то event.target будет эта самая кнопка.

Пример 1: Определяем, по какой кнопке кликнули

<button class="color-btn">Красный</button>
<button class="color-btn">Зелёный</button>
<button class="color-btn">Синий</button>
const buttons = document.querySelectorAll('.color-btn');
buttons.forEach(btn => {
  btn.addEventListener('click', function(event) {
    console.log('Вы кликнули по кнопке:', event.target.textContent);
    // Можно даже менять стиль самой кнопки!
    event.target.style.backgroundColor = 'yellow';
  });
});

event.target всегда будет именно та кнопка, по которой кликнули, даже если обработчик один на всех.

Аналогия

Представьте, что у вас есть три звонка на двери, каждый ведёт к разной квартире, но все подключены к одному домофону. Когда кто-то звонит, вы по номеру звонка (event.target) понимаете, к кому пришли гости.

Важно!

Если обработчик навешан не на саму кнопку, а на её родителя, а пользователь кликнул по вложенному элементу (например, по иконке внутри кнопки), event.target всё равно будет тот вложенный элемент, по которому реально кликнули.

<button class="color-btn"><span>Красный</span></button>

Если кликнуть по <span>, то event.target будет этот <span>, а не <button>. Это важно для делегирования событий, о чём мы поговорим в будущих лекциях.

3. event.type: какой тип события произошёл?

Следующее полезное свойство — event.type.

event.type — это строка, которая содержит название события, которое произошло: "click", "input", "keydown", "mouseover" и т.д.

Пример 2: Универсальный обработчик для разных событий

const btn = document.getElementById('myBtn');
btn.addEventListener('click', function(event) {
  console.log('Тип события:', event.type); // выведет 'click'
});

btn.addEventListener('mouseover', function(event) {
  console.log('Тип события:', event.type); // выведет 'mouseover'
});

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

function handler(event) {
  if (event.type === 'click') {
    console.log('Клик!');
  } else if (event.type === 'mouseover') {
    console.log('Навели мышку!');
  }
}

btn.addEventListener('click', handler);
btn.addEventListener('mouseover', handler);

Зачем это нужно?

  • Для логирования (записи в консоль, что именно произошло).
  • Для универсальных функций, которые могут реагировать на разные типы событий.
  • Для отладки: иногда вы не уверены, что за событие сработало.

4. event.preventDefault(): отмена стандартного поведения

Многие элементы в HTML имеют стандартное поведение. Например:

  • <a href="#"> по клику пытается перейти по ссылке.
  • <form> по отправке перезагружает страницу.
  • <input type="checkbox"> меняет своё состояние.

Иногда нам это поведение не нужно — мы хотим полностью контролировать, что произойдёт. Для этого у объекта события есть метод preventDefault().

event.preventDefault() — отменяет стандартное действие браузера для события.

Пример 3: Отключаем переход по ссылке

<a href="https://ya.ru" id="link">Перейти на Яндекс</a>
document.getElementById('link').addEventListener('click', function(event) {
  event.preventDefault(); // Отменяем переход по ссылке
  alert('Переход отменён! Вы остаетесь здесь :)');
});

Теперь при клике на ссылку страница никуда не переходит, а появляется наше сообщение.

Пример 4: Отключаем отправку формы

<form id="myForm">
  <input type="text" name="name" placeholder="Ваше имя">
  <button type="submit">Отправить</button>
</form>
document.getElementById('myForm').addEventListener('submit', function(event) {
  event.preventDefault(); // Останавливаем стандартную отправку формы (перезагрузку)
  alert('Форма не отправлена! Но мы всё равно вас любим :)');
});

Когда нужно использовать preventDefault?

  • Когда вы хотите обработать событие самостоятельно (например, отправить данные формы через AJAX, а не перезагружать страницу).
  • Когда стандартное поведение мешает вашей логике (например, drag&drop, кастомные чекбоксы, выпадающие списки и т.д.).

Важно!

Если не вызвать event.preventDefault(), браузер выполнит стандартное действие, и ваш код может не сработать как задумано.

5. Практика: динамический список с удалением элементов

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

<ul id="todo-list">
  <li>Купить хлеб <button class="remove-btn">✖</button></li>
  <li>Позвонить маме <button class="remove-btn">✖</button></li>
  <li>Посмотреть лекцию <button class="remove-btn">✖</button></li>
</ul>
// Получаем все кнопки "✖"
const removeButtons = document.querySelectorAll('.remove-btn');

removeButtons.forEach(btn => {
  btn.addEventListener('click', function(event) {
    // event.target — это кнопка "✖"
    // event.target.parentElement — это <li>, который нужно удалить
    event.target.parentElement.remove();
    // Можно даже отменить стандартное действие, если оно есть (на всякий случай)
    event.preventDefault();
  });
});

Теперь при клике на крестик соответствующий пункт исчезает из списка.

6. Ещё немного полезных свойств объекта события

Хотя сегодня мы фокусируемся на target, type и preventDefault, объект события содержит и другие полезные свойства:

  • event.currentTarget — элемент, на котором "висит" обработчик (иногда отличается от event.target).
  • event.clientX / event.clientY — координаты мыши при событии (для mouse-событий).
  • event.key — нажатая клавиша (для keyboard-событий).
  • event.defaultPrevented — флаг, был ли вызван preventDefault.

Но не будем забегать вперёд — с этим познакомимся в будущих лекциях!

7. Типичные ошибки при работе с объектом события

Ошибка №1: Не передаём объект события в обработчик

button.addEventListener('click', function() {
  console.log(event.target); // Ошибка! event не определён
});

В этом случае переменная event не объявлена в функции. Нужно обязательно указать параметр:

button.addEventListener('click', function(event) {
  console.log(event.target); // Теперь всё работает!
});

Ошибка №2: Путаем event.target и this

Внутри обычной функции-обработчика (function(event) { ... }) this ссылается на элемент, на котором "висит" обработчик, а event.target — на элемент, по которому реально кликнули (может быть вложенным). Это не всегда одно и то же!

Ошибка №3: Забываем вызвать preventDefault()

Например, пишем обработчик для формы, но забываем отменить стандартное поведение:

form.addEventListener('submit', function(event) {
  // alert срабатывает, но страница всё равно перезагружается!
  alert('Спасибо!');
});

Нужно обязательно добавить event.preventDefault();, иначе браузер отправит форму и перезагрузит страницу.

Ошибка №4: Используем стрелочные функции там, где нужен this

В стрелочных функциях this не ссылается на DOM-элемент, а берётся из внешнего контекста. Если вам нужен именно DOM-элемент, используйте обычную функцию.

button.addEventListener('click', (event) => {
  console.log(this); // Не кнопка!
});
1
Задача
Модуль 1: Web Core, 23 уровень, 3 лекция
Недоступна
Сохранение настроек
Сохранение настроек
1
Задача
Модуль 1: Web Core, 23 уровень, 3 лекция
Недоступна
Данные формы
Данные формы
1
Опрос
Map, Set и итераторы, 23 уровень, 3 лекция
Недоступен
Map, Set и итераторы
Map, Set и итераторы
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ