Разница между onbeforeunload и onunload
В чем разница между onbeforeunload и onunload?
Также у меня есть конкретный вопрос, связанный с его использованием на iPad... У меня есть страница (myPage.html), где я пытаюсь показать предупреждение, когда страница закрыта (т.е. X нажата, чтобы закрыть вкладку на iPad)
Теперь я попытался использовать как window.onunload, так и window.onbeforeunload
Ниже приведены мои результаты на iPad;
-
Используя window.onunload, я могу получить предупреждение, когда пользователь перейдет на другую страницу из myPage.html(либо нажав на какую-либо ссылку, либо выполнив поиск Google, находясь на myPage.html). Однако ничего не происходит, когда вкладка закрыта из минимизированного представления (X)
-
Используя window.onbeforeunload, я не получаю предупреждение, даже если пользователь переходит на другую страницу из myPage.html ИЛИ, если он закрывает вкладку (X) из свернутого представления.
Я хотел знать, есть ли альтернативный способ исправить эту проблему?
Спасибо.
Ответы
Ответ 1
onunload
отвечает за выполнение команды, когда страница закрыта. Это также вызывает проблемы с IE и AJAX.
onbeforeunload
более эффективен, потому что он не работает в конкуренции с фактическим закрытием окна и запускается до onunload
Я знаю, что Opera не признавала onbeforeunload
- не уверен, что они исправили это, но я всегда регистрирую слушателя как безопасный:
window.onunload = window.onbeforeunload = (function(){...
Ответ 2
Добавление с помощью AlienWebguy ans, чтобы избежать двойных вызовов в браузерах, поддерживающих оба события,
var onBeforeUnLoadEvent = false;
window.onunload = window.onbeforeunload= function(){
if(!onBeforeUnLoadEvent){
onBeforeUnLoadEvent = true;
//your code here
}
};
Ответ 3
Одна существенная разница (кроме отмены) между onbeforeunload
и onunload
заключается в том, что первая запускается для ссылок загрузки, а вторая - нет. Пример: <a href="https://somewhere.com/thething.zip">download</a>
запускает обработчик onbeforeunload
, но не onunload
.
Ответ 4
onbeforeunload
:
- Вызывается перед началом разгрузки
- MDN говорит мне, вы можете отменить закрытие страницы с помощью
event.preventDefault();
- или возвращая значение не-void (т.е. значение!= 0), на странице появится диалоговое окно подтверждения, которое позволяет пользователю выбрать отмену закрытия
- MDN также говорит, что Opera 12 и поддержка onbeforeunload - похоже, что она поддерживается на некоторое время сейчас
onunload
:
- Вызывается после разгрузки, но перед любым освобождением ресурса (его непонятно мне, что именно делается за этот период)
- Слишком поздно закрыть страницу в этот момент
Единственная причина, по которой я могу подумать, почему вы хотите использовать onunload
over onbeforeunload
, будет где ваш код onunload
может занять некоторое значительное время и не хочет, чтобы пользователь видел окно, зависающее при закрытии.