ページが破棄されたときに発生するbeforeunload
eventがあります (リンクをたどるため、ウィンドウが閉じられている場合、または更新されている場合など)。例:
window.onbeforeunload = function(event) {
var s = "You have unsaved changes. Really leave?";
event = event || window.event;
if (event) {
// This is for IE
event.returnValue = s;
}
// This is for all other browsers
return s;
}
明らかな理由から、beforeunload
イベントのハンドラーで実行できることには非常に厳しい制限があり、上記でわかるようにbeforeunload
、ハンドラーは通常のイベント ハンドラーとは異なるシグネチャを持っています。基本的に、あなたのコードは非同期に何もできず、新しいウィンドウを開くことも、イベントをキャンセルすることもできません。文字列を返すことができます。もしそうなら、ブラウザーは、本当にページを離れたいかどうかを尋ねるウィンドウをポップアップ表示し、そのポップアップに文字列を含めます。
質問に対するあなたのコメントから:
以前にそれが必要だったので、ajax リクエストを発行していくつかのものを更新できます...
質問が最初に尋ねられてから何年も経ってから、ここでそれを行う方法は、ビーコン APIを使用することです。これにより、ブラウザがページを破棄して次のページに移動するプロセスを遅くすることなく、非ブロッキングの非同期リクエストをサーバーに送信できます。
navigator.sendBeacon("/path/to/notify", optionalData);
これはセンド アンド フォーゲットですが、ページが取り壊されてもブラウザはキャンセルしません (標準の非同期 ajax リクエストのように)。代わりに、ページが削除されていても、そのリクエストを完了することができます。
この回答が最初に書かれた 2012 年にさかのぼると、時間がかかりすぎなければ、通常は同期ajax 呼び出し ( ) を使用できます。async: false
しかし、今では確実にそれを行うことはできません (そして、それは決して良い考えではありませんでした.UI を保持しています)。