- Зачем нужен метод preventDefault
- Объект события и метод preventDefault
- Пример: когда ссылка — не ссылка
- Пример: проверка формы перед отправкой
- Неотменяемые события
- Больше практики в JavaScript
- JavaScript — Отмена стандартного действия браузера
- Действия браузера по умолчанию
- Отмена стандартного действия браузера
- Влияет ли отмена стандартного действия, которое выполняет браузер, на его всплытие
- .prevent Default ( )
- Как пишется
- Пример
- Как понять
- На практике
- Георгий Милевский советует
Зачем нужен метод preventDefault
Возможно, вам уже когда-то встречалась в коде такая строка — evt.preventDefault() . Например, в тренажёрах по JavaScript. Давайте подробно разберём, зачем она нужна.
При разработке таких типичных элементов интерфейса, как форма или попап, часто нужно изменить поведение браузера по умолчанию. Допустим, при клике по ссылке мы хотим, чтобы открывался попап, но вместо этого браузер будет автоматически переходить по адресу, указанному в атрибуте href . Или вот другая проблема — мы хотим перед отправкой формы проверять корректность введённых данных, но после нажатия на кнопку submit форма каждый раз будет отправляться на сервер, даже если там куча ошибок. Такое поведение браузера нам не подходит, поэтому мы научимся его переопределять.
Объект события и метод preventDefault
Событие — это какое-то действие, произошедшее на странице. Например, клик, нажатие кнопки, движение мыши, отправка формы и так далее. Когда срабатывает событие, браузер создаёт объект события Event. Этот объект содержит всю информацию о событии. У него есть свои свойства и методы, с помощью которых можно эту информацию получить и использовать. Один из методов как раз позволяет отменить действие браузера по умолчанию — preventDefault() .
Event можно передать в функцию-обработчик события и в ней указать инструкции, которые должны быть выполнены, когда оно сработает. При передаче объекта события в обработчик обычно используется сокращённое написание — evt .
Пример: когда ссылка — не ссылка
Ранее мы уже говорили о попапе, который должен появляться при клике на ссылку — давайте разберём этот кейс на практике. Так будет выглядеть разметка в упрощённом виде:
Мы хотим при клике на ссылку 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 . Допустим, мы хотим перед отправкой проверять введённые данные, потому что в поле ввода обязательно должно быть значение ‘Кекс’ и никакое другое. Разметка формы:
При нажатии на кнопку «Готово» сработает событие отправки формы 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
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.
JavaScript — Отмена стандартного действия браузера
На этом уроке мы рассмотрим, как можно отменить стандартные действия браузера, которые происходят, когда пользователь взаимодействует с некоторыми элементами веб-страницы. Также узнаем как отмена стандартного действия, которое выполняет браузер, влияет не его всплытие.
Действия браузера по умолчанию
Имеется много различных событий, при наступлении которых браузер выполняет определённые стандартные действия:
- mousedown — запускает выделение при перемещение мыши;
- click на элементе — переходит на указанный URL;
- click на — устанавливает или снимает флажок;
- click на кнопке с type=»submit» или нажатие Enter внутри поля формы вызывает событие submit и отправляет форму на сервер;
- keydown — нажатие клавиши может привести к добавлению символа в поле или другим действиям;
- contextmenu — событие происходит при щелчке правой кнопкой мыши (выполняет отображение контекстного меню браузера и т.п.).
Иногда в процессе обработке этих событий вы хотите, чтобы браузер не выполнял соответствующее стандартное действие. Его необходимо отменить и вместо него выполнить другое действие. В JavaScript возможно отменить стандартное действие браузера, для этого используется метод preventDefault .
Отмена стандартного действия браузера
Отмена стандартного действия браузера осуществляется посредством вызова метода preventDefault в обработчике события.
$element.addEventListener('click', function(e) { // отменяем стандартное действие браузера e.preventDefault(); . }, false);
Например, отменим стандартное действие для элемента а , имеющего id=»myAnchor» :
Перейти на сайт Яндекс
Если вы подписались на событие через JavaScript с помощью свойства объекта on[event] , т.е. способом, не рекомендованным стандартом ( addEventListener() ). То для отмены стандартного действия кроме event.preventDefault() также можно ещё использовать return false .
Предупреждение: Данный способ ( return false ) не будет работать, если обработчик назначен через метод addEventListener() .
element.onclick = function(event) { //. return false; }
Изменим вышеприведённый пример, выполнив подписку на событие » click » через свойство DOM-элемента on[событие] . Для прерывания выполнения действия будем использовать инструкцию return false :
Перейти на сайт Яндекс
Возможность отменять стандартные действия браузера очень часто применяются перед отправкой формы на сервер. Она используется для того чтобы проверить правильность заполнения формы с помощью скриптов JavaScript.
Влияет ли отмена стандартного действия, которое выполняет браузер, на его всплытие
В этом разделе мы рассмотрим следующий вопрос: «Влияет ли на всплытие события то, что мы отменили выполнение стандартного действия браузера, которое с ним связано?»
Чтобы разобраться в этом вопросе, давайте рассмотрим следующий пример:
Перейти на сайт Яндекс
Из этого примера видно, что отмена стандартного действия браузера (переход на страницу, указанную в атрибуте href , при нажатии на ссылку) не останавливает всплытие пузырька (события).
Следовательно, отмена стандартного действия браузера для некоторого события не влияет на всплытие пузырька (события), т.е. они выполняются не зависимо друг от друга
В ситуациях, когда Вам необходимо отменить стандартное действие браузера и всплытие события (пузырька), можно использовать следующий код:
element.addEventListener("click",function(event) { . //отменить стандартные действия браузера еvent.рreventDefault(); //отменить всплытие события, т.е. проткнуть пузырь event.stopPropagation(); },false);
Внимание: Не любое стандартное действие браузера можно отменить. Это может быть связано с тем, что стандартные действия для некоторых событий браузер выполняет до того как происходит вызов его обработчика. Следовательно, такие действия уже отменить нельзя. Кроме этого, стандартное действие для некоторых событий браузер не позволяет отменить из-за политики безопасности, которая в нём используется.
.prevent Default ( )
На каждое действие пользователя на сайте, браузер создаёт события. Это наш главный способ в коде понимать, что происходит на странице. Событие — это объект, который имеет набор свойств и методов для взаимодействия с ним.
prevent Default ( ) — метод события. Этот метод отменяет поведение браузера по умолчанию, которое происходит при обработке события.
Например, при нажатии на ссылку, мы переходим по адресу этой ссылки. Вызов prevent Default ( ) отменит это поведение.
Как пишется
Скопировать ссылку "Как пишется" Скопировано
Отменим переход по ссылке для всех тегов на странице. Для этого получим все ссылки с помощью query Selector ( ) , подпишемся на событие 'click' , и вызовем prevent Default ( ) :
const links = document.querySelector('a') links.addEventListener('click', (event) => // отменяем действие по умолчанию. Перехода по ссылке не будет event.preventDefault()>)
const links = document.querySelector('a') links.addEventListener('click', (event) => // отменяем действие по умолчанию. Перехода по ссылке не будет event.preventDefault() >)
Пример
Скопировать ссылку "Пример" Скопировано
Как понять
Скопировать ссылку "Как понять" Скопировано
Давайте разберём код из интерактивного примера:
const runTimer = (inputElement) => setTimetout(() => inputElement.focus() >, 5000) > const inputElement = document.querySelector('.input') inputElement.addEventListener('mousedown', (event) => event.preventDefault() runTimer(inputElement) >);
const runTimer = (inputElement) => setTimetout(() => inputElement.focus() >, 5000) > const inputElement = document.querySelector('.input') inputElement.addEventListener('mousedown', (event) => event.preventDefault() runTimer(inputElement) >);
Когда пользователь нажимает на инпут элемент, генерируется цепочка событий в следующем порядке: mousedown -> mouseup -> click .
Когда происходит событие mousedown , браузер устанавливает фокус на поле ввода. Вызовом event . prevent Default ( ) мы отменили это поведение. Затем мы запустили таймер, который установит фокус на инпут через 5 секунд с помощью вызова метода focus ( ) .
На практике
Скопировать ссылку "На практике" Скопировано
Георгий Милевский советует
Скопировать ссылку "Георгий Милевский советует" Скопировано
🛠 Часто возникает необходимость отправить данные из формы на сервер без перезагрузки страницы. Поведение по умолчанию формы — это отправка запроса на сервер и перезагрузка страницы. И тут нам на помощь приходит метод prevent Default ( ) , который отменит действия связанные с отправкой формы:
form class="discount-form"> label for="promocode">Промокодlabel> input id="promocode" type="text" name="promocode" placeholder="WIN-1234" required> button type="submit">Применитьbutton> form>
const form = document.querySelector('.discount-form')form.addEventListener('submit', (event) => event.preventDefault() // код по подготовке данных // и их отправка на сервер>)
const form = document.querySelector('.discount-form') form.addEventListener('submit', (event) => event.preventDefault() // код по подготовке данных // и их отправка на сервер >)
Подробнее этот подход разбирается в статье «Работа с формами».