10

そのようなことはありますか?

すべてのリンクのクリック イベントで関数をフックできることはわかっていますが、更新など、ページが変更される状況や、別のスクリプトが window.location を変更する場合もあります。


最後に、次のように、unload イベントから文字列トラフ postMessage を送信することでそれを行いました。

$(window).bind('unload', function(e){
  window.parent.postMessage('unloading');
});

親ドキュメント:

$(window).bind('message', function(e){     
  if(e.originalEvent.data == 'unloading'){
    // ajax stuff here
  }
});

うまくいくようです。私はおそらくiframeが関係していると述べたはずです:)

4

3 に答える 3

27

ページが破棄されたときに発生するbeforeunloadeventがあります (リンクをたどるため、ウィンドウが閉じられている場合、または更新されている場合など)。例:

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 を保持しています)。

于 2012-06-24T11:56:59.220 に答える
6

jQueryにはアンロード機能があります:

ユーザーがページから移動すると、unload イベントが window 要素に送信されます。これは、多くのことの 1 つを意味する可能性があります。ユーザーがリンクをクリックしてページを離れたか、アドレス バーに新しい URL を入力した可能性があります。進むボタンと戻るボタンがイベントをトリガーします。ブラウザ ウィンドウを閉じると、イベントがトリガーされます。ページのリロードでも、最初にアンロード イベントが作成されます。

windowこれは、の代わりにオブジェクトにバインドする必要があることに注意してくださいdocument

$(window).unload(function() {
    // do something
});

beforeunloadハンドラをイベントにバインドすることもできます:

$(window).bind('beforeunload', function() {
    // do something, preferably ajax request etc
    return 'are you sure?';
});
于 2012-06-24T11:58:23.660 に答える
1

ページがリロードされると、以前にあったものはすべてなくなります。したがって、前のページから新しいコンテキストにコードを「プッシュ」することはできないため、あなたが話していることは、DOMReady で行うこと、または新しいページで「ロード」することのようです。

于 2012-06-24T11:57:35.280 に答える