Вебсправочник
Ваш первый сайт

Урок: проверить, можно ли отменить событие

PreventDefault действует только на отменяемое событие и при подходящих условиях обработчика. Урок отделяет признак cancelable от факта defaultPrevented на безопасном синтетическом примере.

Назначение

PreventDefault действует только на отменяемое событие и при подходящих условиях обработчика. Урок отделяет признак cancelable от факта defaultPrevented на безопасном синтетическом примере.

Как это работает

Создайте самостоятельный EventTarget и два события своего типа. Обработчик вызывает preventDefault. Это не имитация настоящего пользовательского действия, а проверка механики отмены без изменения страницы.

Пример

const target = new EventTarget();
target.addEventListener("lesson", event => event.preventDefault());
const fixed = new Event("lesson", {cancelable:false});
const cancelable = new Event("lesson", {cancelable:true});
console.log(target.dispatchEvent(fixed), fixed.defaultPrevented);
console.log(target.dispatchEvent(cancelable), cancelable.defaultPrevented);

Что должно получиться

Для неотменяемого события defaultPrevented остаётся false. Для отменяемого становится true, а dispatchEvent возвращает false, сообщая об отмене обработчиком.

Граница применения и частая ошибка

Отмена действия по умолчанию не прекращает распространение события. В passive-обработчике preventDefault не должен использоваться для отмены. Синтетическое событие не получает автоматически все возможности доверенного пользовательского ввода.

Самостоятельная проверка

Добавьте второй обработчик и убедитесь, что он всё ещё вызывается после preventDefault. Затем сравните с stopPropagation на отдельной DOM-структуре. Не используйте отмену как способ скрыть неизвестную причину ошибки.

Самостоятельный учебный материал. Техническая документация: первоисточник по теме ↗. Если результат отличается, проверьте код и версию браузера.