Разница между onbeforeunload и onunload - PullRequest
32 голосов
/ 01 августа 2011

Каковы различия между onbeforeunload и onunload?Также у меня есть конкретный вопрос, связанный с его использованием на iPad ... У меня есть страница (myPage.html), где я пытаюсь показать предупреждение, когда страница закрыта (то есть X нажимается, чтобы закрыть вкладку на iPad)

Теперь я попытался использовать и window.onunload, и window.onbeforeunload. Ниже приведены мои выводы об iPad;

  1. Используя window.onunload, я могу получить предупреждениекогда пользователь переходит на другую страницу из myPage.html (либо нажав на какую-либо ссылку, либо выполнив поиск в Google, находясь в myPage.html).Однако ничего не происходит, когда вкладка закрывается из свернутого представления (X)

  2. Используя window.onbeforeunload, я также не получаю оповещения, даже если пользователь переходит на другую страницу из myPage.htmlИЛИ если он закроет вкладку (X) в свернутом виде.

Я хотел бы знать, есть ли альтернативный способ решения этой проблемы?

Спасибо.

Ответы [ 4 ]

18 голосов
/ 13 ноября 2013

Добавление с помощью ответов AlienWebguy, чтобы избежать двойных вызовов в браузерах, поддерживающих оба события,

var onBeforeUnLoadEvent = false;

window.onunload = window.onbeforeunload= function(){
if(!onBeforeUnLoadEvent){
  onBeforeUnLoadEvent = true;
  //your code here
  }
};
14 голосов
/ 01 августа 2011

onunload отвечает за выполнение инструкции при закрытии страницы.Это также вызывает проблемы с IE и AJAX.

onbeforeunload более эффективен, потому что он не работает в конкуренции с фактическим закрытием окна и срабатывает до onunload

Я знаю, что Opera раньше не признавала onbeforeunload -не уверен, что они это исправили, но я всегда регистрирую слушателя, чтобы оба были в безопасности:

window.onunload = window.onbeforeunload = (function(){...
9 голосов
/ 13 июня 2014

onbeforeunload:

  • Вызывается до начала разгрузки
  • MDN сообщает мне , что вы можете отменить закрытие страницы, используя event.preventDefault();
  • или при возврате не пустого значения (т. Е. Значения! = 0), на странице появится диалоговое окно подтверждения, которое позволяет пользователю выбрать отмену закрытия
  • MDN также сообщает Opera 12 иup support onbeforeunload - похоже, что он некоторое время поддерживал его

onunload:

  • Вызывается после начала выгрузки, но до освобождения какого-либо ресурса (не ясномне, что именно сделано за этот период)
  • Слишком поздно отменять закрытие страницы в этот момент

Единственная причина, по которой я могу думать, почемувы бы хотели использовать onunload сверх onbeforeunload, где ваш код onunload мог бы занять значительное время, и вы не хотите, чтобы пользователь видел окно, которое зависает при закрытии.

8 голосов
/ 07 августа 2015

Одно существенное различие (кроме отменяемости) между onbeforeunload и onunload заключается в том, что первое срабатывает для ссылок на скачивание, а второе - нет. Пример: <a href="https://somewhere.com/thething.zip">download</a> вызовет обработчик onbeforeunload, но не onunload.

...