3

ページのアンロード時に、ユーザーの作品の下書きを削除するリクエストを発行している状況があります。これは、ユーザーがページを更新することを選択するまで問題なく機能します。その後、Chrome のネットワーク タブを調べると、Ajax リクエストが実際に起動される前に Chrome が新しいページを読み込んでいることが示されます。その結果、ページの読み込みによって新しいドラフトが作成され、ajax 呼び出しによってすぐに削除されます。基本的に私がやっていることは次のとおりです。

window.onbeforeunload = function(){
    if (pageUpdated){
        return 'Are you sure you want to abandon this draft?';
    }
}

window.onunload = function(){
    $.ajax({
        async: false,
        type: 'DELETE',
        url: '/some/url/'
    });
}

新しいページのリクエストが送信される前に onunload ハンドラを強制的に完了する方法はありますか?

テスト済みブラウザ: (Chrome 9、FF 3.6) Ubuntu 10.04 Lucid

4

4 に答える 4

4

onbeforeunload または $.unload() で、async = false で AJAX オブジェクトを設定します。これにより、ページがアンロードされる前に ajax 呼び出しが確実に完了します。

この質問が数か月前のものであることは知っていますが、AJAX で同様の問題を探している人に役立つ場合に備えて、この情報を追加したかったのです!

于 2011-08-12T15:19:58.910 に答える
3

XHRリクエストを同期化すると、リクエストが完了するまで新しいページの読み込みが遅れるはずです。jQueryが内部で同期XHRリクエストを実行する方法はわかりませんが、プレーンJavaScriptを使用して実行する方法は次のとおりです。

var request = new XMLHttpRequest();
// or new ActiveXObject("Microsoft.XMLHTTP") for some versions of IE
request.open("GET", "/some/url", false);
request.send(null);

var result = request.responseText;
alert(result);

これをアンロードハンドラーに入れると、ブラウザーは「/ some / url」がロードされるまで待機してから、次のページに移動します。

于 2011-05-22T02:58:05.657 に答える
3

@Silksterの回答を確認するためにここにいます。オプション async = false を設定した後、AJAX リクエストを起動できます

これがサンプルコードです。

$(window).unload( function () {
    $.ajaxSetup ({
        async: false  
    });
    $.get("target.php");
});
于 2012-09-19T12:36:35.197 に答える
1

代わりに使用してみることができますがwindow.onbeforeunload、すべてのブラウザに実装されているかどうかはわかりません。

于 2011-02-17T20:31:31.123 に答える