DOM Advanced

Действия браузера по умолчанию

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

Продвинутый (Advanced)

Кратко

Браузер выполняет действия по умолчанию: клик по ссылке → переход, submit формы → отправка и перезагрузка, контекстное меню → меню браузера. event.preventDefault() отменяет это действие. event.stopPropagation() останавливает распространение события. Это два разных механизма.


Подробно

Типичные default actions:

  • <a href="..."> — переход по ссылке
  • <form> submit — отправка формы и перезагрузка страницы
  • Контекстное меню (правая кнопка)
  • Выделение текста
  • <input type="submit"> — отправка формы

preventDefault():

document.querySelector('a').addEventListener('click', (e) => { e.preventDefault(); // переход по ссылке отменён console.log('Ссылка не работает!'); });

document.querySelector('form').addEventListener('submit', (e) => { e.preventDefault(); // форма не отправится, страница не перезагрузится // ... своя логика });

Важно: preventDefault работает ТОЛЬКО в обработчике, где вызван.

Сравнение:

  • preventDefault() — останавливает default action браузера
  • stopPropagation() — останавливает распространение события

Они НЕЗАВИСИМЫ:

  • preventDefault() + stopPropagation() — и отмена, и остановка
  • preventDefault() без stopPropagation() — отмена, событие продолжает всплывать
  • stopPropagation() без preventDefault() — событие остановлено, но default action происходит

return false (legacy): В inline handlers (onclick="...") return false предотвращает default action И останавливает propagation. Но в addEventListener return false ничего не делает. Не используйте return false в modern JavaScript.


Ментальная модель

preventDefault — как отмена заказа. Вы заказали доставку (браузер хочет перейти по ссылке), но передумали (preventDefault). Доставка отменена. stopPropagation — как закрытие двери. Событие (посылка) доходит до вас, но дальше не проходит. Разные механизмы.


Примеры

**Самый простой:**

html
<a href="https://example.com">Ссылка</a>

<script>
document.querySelector('a').addEventListener('click', (e) => {
  e.preventDefault();
  console.log('Переход отменён!');
});
</script>

preventDefault() отменяет переход по ссылке.

**Простой:**

html
<form id="myForm">
  <input type="text" name="name">
  <button type="submit">Отправить</button>
</form>

<script>
document.getElementById('myForm').addEventListener('submit', (e) => {
  e.preventDefault();
  const formData = new FormData(e.target);
  console.log('Имя:', formData.get('name'));
  // Форма НЕ отправится, страница НЕ перезагрузится
});
</script>

preventDefault на submit: перехватываем отправку формы.

**Реальный пример:**

javascript
// Запрет контекстного меню
document.addEventListener('contextmenu', (e) => {
  e.preventDefault();
  console.log('Контекстное меню запрещено');
});

// Запрет выделения текста
document.querySelector('.no-select').addEventListener('mousedown', (e) => {
  e.preventDefault();
});

// Кастомное контекстное меню
document.addEventListener('contextmenu', (e) => {
  e.preventDefault();
  const menu = document.getElementById('custom-menu');
  menu.style.display = 'block';
  menu.style.left = e.pageX + 'px';
  menu.style.top = e.pageY + 'px';
});

Реальный пример: кастомное контекстное меню вместо стандартного.


Частые ошибки

**Неправильно:** Путать preventDefault и stopPropagation

**Почему:** preventDefault — отменяет действие браузера. stopPropagation — останавливает всплытие/погружение.

**Правильно:** preventDefault = «не делай то, что обычно делаешь». stopPropagation = «не передавай дальше».

**Неправильно:** Использовать return false в addEventListener

**Почему:** return false работает ТОЛЬКО в inline handlers. В addEventListener он ничего не делает.

**Правильно:** Используйте event.preventDefault() в addEventListener.

**Неправильно:** Думать, что preventDefault останавливает все listener'ы

**Почему:** preventDefault НЕ останавливает другие listener'ы на том же элементе. Он только отменяет default action.

**Правильно:** Для остановки propagation используйте stopPropagation.


Важно запомнить

  • preventDefault() отменяет default action браузера
  • stopPropagation() останавливает распространение
  • Они независимы — можно комбинировать
  • return legacy = legacy, не используйте в addEventListener
  • preventDefault не останавливает другие listener'ы

Связь

Назад: Вы понимаете всплытие событий (DA2) и делегирование (DA3). Теперь вы учитесь управлять тем, что происходит при событиях.

Вперёд: Следующий урок (DA5) — пользовательские события: создание собственных типов событий.

Материалы курса DOM Advanced — PROlab Academy.