web-dev-qa-db-ja.com

onbeforeunloadとonunloadの違い

Onbeforeunloadとonunloadの違いは何ですか?また、iPadでの使用に関連する特定の質問があります...ページ(myPage.html)があり、ページを閉じたときに警告を表示しようとしています(iPadでXを押してタブを閉じます)。

今私はwindow.onunloadとwindow.onbeforeunloadの両方を使用してみました以下はiPadでの私の発見です。

  1. Window.onunloadを使用すると、ユーザーがmyPage.htmlから別のページに移動したときに(リンクをクリックするか、myPage.htmlでGoogle検索を実行して)アラートを受け取ることができます。ただし、最小化されたビュー(X)からタブを閉じると何も起こりません

  2. Window.onbeforeunloadを使用すると、ユーザーがmyPage.html OR=最小化されたビューからタブ(X)を閉じた場合)から別のページに移動しても、アラートは表示されません。

この問題を修正する別の方法があるかどうか知りたいですか?

ありがとうございました。

35
testndtv

onunloadは、ページが閉じられたときに命令を実行する責任があります。また、IEおよびAJAXで問題が発生します。

onbeforeunloadは、ウィンドウの実際のクローズと競合せずに実行され、onunloadの前にトリガーされるため、より効率的です。

私は知っていますOpera以前は確認応答しなかったonbeforeunload-彼らがそれを修正したかどうかはわかりませんが、両方が安全であるために常にリスナーを登録します:

window.onunload = window.onbeforeunload = (function(){...
16
AlienWebguy

AlienWebguyのansを追加して、両方のイベントをサポートするブラウザーでの二重呼び出しを回避します。

var onBeforeUnLoadEvent = false;

window.onunload = window.onbeforeunload= function(){
if(!onBeforeUnLoadEvent){
  onBeforeUnLoadEvent = true;
  //your code here
  }
};
19
noboundaries

onbeforeunload

  • アンロードが始まる前に呼び出されます
  • MDNが教えてくれますevent.preventDefault();を使用してページのクローズをキャンセルできます
  • または非void値(つまり、値!= 0)を返すことにより、ページは確認ダイアログをポップアップし、ユーザーが閉じるのキャンセルを選択できるようにします。
  • MDNはまたOpera 12以上のサポートonbeforeunloadと言っています-しばらくの間サポートされているようです

onunload

  • アンロードが開始された後、リソースの割り当て解除の前に呼び出されます(この期間中にisが正確に何が行われたかはわかりません)
  • この時点でページをキャンセルするのは遅すぎます

onunloadよりもonbeforeunloadを使用する理由を私が考えることができる唯一の理由は、onunloadコードにかなりの時間がかかり、ユーザーを望まない場合です閉じるときにハングするウィンドウを表示します。

10
B T

onbeforeunloadonunloadの(キャンセル可能性以外の)1つの重要な違いは、前者はダウンロードリンクに対してトリガーされ、後者はトリガーされないことです。例:<a href="https://somewhere.com/thething.Zip">download</a>onbeforeunloadハンドラーをトリガーしますが、onunloadはトリガーしません。

8
dvdplm