🚀 Вам бесплатно доступен тренажёр по HTML и CSS.

Возможно, вам уже когда-то встречалась в коде такая строка — evt.preventDefault(). Например, в тренажёрах по JavaScript. Давайте подробно разберём, зачем она нужна.

При разработке таких типичных элементов интерфейса, как форма или попап, часто нужно изменить поведение браузера по умолчанию. Допустим, при клике по ссылке мы хотим, чтобы открывался попап, но вместо этого браузер будет автоматически переходить по адресу, указанному в атрибуте href. Или вот другая проблема — мы хотим перед отправкой формы проверять корректность введённых данных, но после нажатия на кнопку submit форма каждый раз будет отправляться на сервер, даже если там куча ошибок. Такое поведение браузера нам не подходит, поэтому мы научимся его переопределять.

Объект события и метод preventDefault

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

Event можно передать в функцию-обработчик события и в ней указать инструкции, которые должны быть выполнены, когда оно сработает. При передаче объекта события в обработчик обычно используется сокращённое написание — evt.

Пример: когда ссылка — не ссылка

Ранее мы уже говорили о попапе, который должен появляться при клике на ссылку — давайте разберём этот кейс на практике. Так будет выглядеть разметка в упрощённом виде:

<a class="click-button" href="pop-up.html">Клик</a>

    <div class="content">
      <!-- Здесь содержимое попапа -->
    </div>

Мы хотим при клике на ссылку click-button добавлять элементу с классом content класс show. Он сделает попап видимым, поменяв значение свойства display с none на block. Напишем логику добавления этого класса с помощью JavaScript:

// Находим на странице кнопку и попап
    const button = document.querySelector('.click-button');
    const popup = document.querySelector('.content');

    // Навешиваем на кнопку обработчик клика
    button.onclick = function (evt) {
      // Отменяем переход по ссылке
      evt.preventDefault();

      // Добавляем попапу класс show, делая его видимым
      popup.classList.add('show');
    };

Если мы уберём строку evt.preventDefault(), вместо попапа откроется отдельная страница pop-up.html, адрес которой прописан в атрибуте href у ссылки. Такая страница нужна, потому что мы хотим, чтобы вся функциональность сайта была доступна, если скрипт по какой-то причине не будет загружен. Именно поэтому мы изначально реализовали кнопку с помощью тега a, а не button. Но у нас с JavaScript всё в порядке, поэтому вместо отдельной страницы мы открыли попап, отменив действие браузера по умолчанию.

Пример: проверка формы перед отправкой

Разберём следующий кейс — отправку формы при нажатии на кнопку submit. Допустим, мы хотим перед отправкой проверять введённые данные, потому что в поле ввода обязательно должно быть значение 'Кекс' и никакое другое. Разметка формы:

<form class="form" action="#" method="post">
      <input class="name" type="text" id="name" name="name">
      <label for="name">Введите имя</label>

      <button type="submit">Готово!</button>
    </form>

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

// Находим на странице форму и инпут
    const form = document.querySelector('.form');
    const name = document.querySelector('.name');

    // Навешиваем на форму обработчик отправки
    form.onsubmit = function(evt) {
      // Проверяем введённое значение на соответствие
      if (name.value !== 'Кекс') {
        // Если значение не подходит, отменяем автоматическую отправку формы
        evt.preventDefault();
        // И выводим предупреждение в консоль
        console.log('Вы не Кекс!');
      }
    };

Здесь мы не дали отправить форму при неверно введённом значении. Но если всё в порядке, условие не выполнится, и форма будет отправлена как обычно.

Неотменяемые события

Не для всех событий можно отменить действие по умолчанию. Например, событие прокручивания страницы scroll проигнорирует попытки отменить его. Чтобы узнать, можно отменить действие по умолчанию или нет, нужно обратиться к свойству cancelable объекта Event. Оно будет равно true, если событие можно отменить, и false — в обратном случае.

document.onscroll = function(evt) {
      // В консоль выведется false
      console.log(evt.cancelable);
      // Отмена не сработает
      evt.preventDefault();
    };

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

Больше практики в JavaScript