Событие на закрытие вкладки

87
28 октября 2021, 00:40

Подскажите ,как реализовать защиту от случайного закрытия вкладки ? Я вкурсе про window.onunload и window.onbeforeunload, но они работают не всегда и некорректно. Например, в Opera они вовсе не воспринимаются. Нужно универсальное, которое работало бы везде. Можете что подсказать ?

Answer 1

К сожалению, универсального решения нет.

onbeforeunload поддерживается в Opera на основе движка WebKit, но не работает в предыдущих версиях, основанных на Presto.

С точки зрения дизайна пользовательского интерфейса, я бы рекомендовал просто придерживаться onunload. И выполнять ajax в данном методе, чтобы сохранить состояние вашей страницы.

onbeforeunload не рекомендуется использовать, так как оно мало что делает, кроме как раздражает пользователя предупреждающим сообщением.

возможно, вам поможет данная статья

https://www.zachleat.com/web/dont-let-the-door-hit-you-onunload-and-onbeforeunload/

Answer 2

Стандартными событиями выгрузки документа являются только beforeunload и unload.

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

Отмена выгрузки документа возможна только в обработчике события beforeunload - опять же, лишь в том случае если браузер разрешит запрос пользователю:

window.addEventListener('beforeunload', function (e) {
  // Попытка отменить выгрузку стандартным способом 
  e.preventDefault();
  // Установка строки запроса пользователю
  e.returnValue = 'Вы уверены в том что хотите покинуть страницу?'; 
});

Браузер может проигнорировать строку в returnValue, показав свой текст, но присвоение этому свойству какого-либо строкового значения требуется для показа диалога (как минимум в Chrome).
"Тихая" отмена выгрузки, без диалога подтверждения - ни в одном браузере не поддерживается, насколько знаю. И это правильно.

READ ALSO
if и ternary в return

if и ternary в return

Почему в return нельзя вставить if

152
Проверка типа данных ячейки в таблице HTML с помощью javascript [дубликат]

Проверка типа данных ячейки в таблице HTML с помощью javascript [дубликат]

Как проверить, что в ячейке лежит число или нет с помощью javascript?

99
Развернуть Cordova на iOS используя Visual Studio и iPhone

Развернуть Cordova на iOS используя Visual Studio и iPhone

Подскажите пожалуйста, кто знает, есть Windows на котором установлена Visual Studio и инструменты CordovaСоздал приложение для Android, и хочу теперь развернуть...

70
Leaflet contextmenu не закрывается

Leaflet contextmenu не закрывается

Никак не могу разобраться почему не пропадает меню при клике вне картыМеню пропадает только при клике на кнопку меню

98