Исправление ошибки «[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive»

7 октября 2023


Такая ошибка возникает в событиях, у которых установлена опция passive: true, запрещающая отменять стандартное действие браузера через метод preventDefault(). Следующий обработчик породит ошибку, так как у события установлено passive: true и внутри вызывается preventDefault():
window.addEventListener('click', function(event){
  event.preventDefault();
  alert('Тестовое сообщение');
}, {
  passive: true
});

Для исправления нужно изменить значение свойства passive с true на false.
В итоге получится вот такой код:
window.addEventListener('click', function(event){
  event.preventDefault();
  alert('Тестовое сообщение');
}, {
  passive: false
});

Спецификация метода  addEventListener() декларирует, что по умолчанию у обработчика всегда стоит passive: false. Но почти все современные браузеры в целях повышения скорости отработки скриптов изменили значение по умолчанию для событий wheel, mousewheel, touchstart и touchmove на вариант passive: true.

Поэтому вот такой обработчик конкретно с touchstart породит ошибку:
window.addEventListener('touchstart', function(event){
  event.preventDefault();
  alert('Тестовое сообщение');
});

Для исправления нужно указать passive: false
window.addEventListener('touchstart', function(event){
  event.preventDefault();
  alert('Тестовое сообщение');
}, {
  passive: false
});