Возможно ли e.preventDefault в window.onPopState?

Я пытаюсь помешать пользователю вернуться в мое веб-приложение. Для этого я попытался поймать window.onpopstate и добавил e.preventDefault, чтобы отменить эффект кнопки "Назад".

Но это, похоже, не происходит.

window.addEventListener('popstate',function(e){ 
console.log(e); e.preventDefault();  
});

Невозможно предотвратить всплывающее событие браузера? Или я делаю что-то неправильно?

Ответ 1

В соответствии с этой документацией событие popstate не отменяется:

Спецификация: HTML5
Интерфейс: PopStateEvent
Пузыри: Да
Отменить: Нет
Цель: defaultView
Действие по умолчанию: Нет

Ответ 2

Прежде всего, "невозможно" никогда не будет приемлемым ответом.

Во-вторых, вы можете компенсировать ошибки popstate. В примере мой богатый редактор должен постоянно компенсировать ленивый ублюдок: Backspace. Это не действительный ключ для кнопки "Назад" (так же, как пробел для "спуска страницы" ), но люди навязывают миру свои личные предпочтения вместо добавления расширения браузера, поэтому, когда люди нажимают на него, иногда появляется popstate, а не редактор, удаляющий все символ находится слева от клавиатуры.

Следующий код (не регистрирующий зависимостей здесь) обнаруживает, когда запущена ошибка popstate, удаляет ее по лицу с помощью e.preventDefault();, а затем фиксирует адрес адресной строки с помощью history.go(1);. Человек, использующий редактор, не замечает, что что-то произошло, поскольку браузеру не разрешалось манипулировать DOM. Этот код минимален (другие люди могут компенсировать эту ошибку в различных контекстах), и я тестировал это только сейчас в Gecko/Firefox, поэтому не забудьте проверить браузеры на Blink, Presto, Trident и WebKit.

window.onpopstate = function(e)
{
 if (id_('editor') && is_node_parent(document.activeElement,id_('editor')))
 {
  e.preventDefault();
  history.go(1);
 }
}