2009-03-01 52 views
12

読んでいただきありがとうございます。jQuery:ページアンロード時に自動的にAjaxRequestsを中止しますか?

私は、1つ以上のajaxリクエストが開いているページがあり、リンクをクリックしてページを残すかリフレッシュすると、アンロードする前にajaxリクエストが完了するのを待ちます。

これは通常問題ではありませんが、要求に時間がかかる場合は問題になります。

私のようなものを探しています:自動的にアンロードする前に要求を中止する

$(window).bind("beforeunload", function() {AjaxRequest.abort();}); 

が、AJAXリクエストを見つける方法をかなり確実ではありません。彼らはどこか窓の下にいるのだろうか?

答えて

8

$.ajax() jQueryメソッドはXMLHttpRequestオブジェクトを返します。これは、abort()のようにオブジェクトに標準的なメソッドを適用できることを意味します。

アンロードするには、組み込みのunload jQueryイベントメソッドを使用します。

var myajax = $.ajax(...); 
$(window).unload(function() { myajax.abort(); }); 
+0

私はjsのエラー "myajax.abort" を取得してい関数ではありません( jquery 1.3.2)は、誰かが "abort beast?" – taber

+0

編集:私は私の$ .ajax(...)呼び出しの最後に ".responseText"を使っていたからだと思います。私は.responseTextを取り出しました、そして今、エラーはありません。わーい。 – taber

+0

アンロードメソッドがJqueryで削除されました:/ – Badiparmagi

1

はあなたが要求ごとにwindow.onunloadイベントプラスAjaxRequestX = $に.get(...)が必要だと思う、多分、配列内のオブジェクトを保持し、アンロードにそれらを介して行きます。

4

私はちょうどこの問題を抱えていました。私は$ .ajaxから呼び出されていたPHPで長いループを行っていました。私の解決策は、session_write_close()を追加することでした。長いループの前に。

私の理論では、Chromeは次のページをの前に要求し、のバックグラウンドajaxリクエストをキャンセルします。あなたのAjaxリクエストが、AND TOから離れて移動しているページと同じ_SESSIONである場合、PHPコードの最初の行でもヒットする前にデッドロックが発生します。

+1

あなたの答えが私の問題を解決しました - ありがとうございました! –

1

あなたはすべてのAjaxリクエストを永続化し、ページがリロードされるとすべてのリクエストを中止する必要があります。サンプル

var _requests = []; 

var _abortAllRequests = function() { 
    $(_requests).each(function (i, xhr) { xhr.abort(); }); 

    _requests = []; 
} 

$(window).on("beforeunload", function() { 
    _abortAllRequests(); 
}); 
どこかにあなたのコード内

_requests.push($.ajax(...)) 

はまた、あなたはイベントajaxStart ajaxStopで$ .ajaxSetupを使用して要求を行ってポップすることはできます

5

へのアップは、次のコードは、テストされ、中止していますすべての未処理のjQuery ajaxリクエストはChromeでページをアンロードしますが、エラーを発生させずにクライアントを使用してEdgeとIEで使用されます。

最初のjQuery readyハンドラとして以下を置き:

$(onPageLoaded) 

、アクセス、このどこかに置く:

function onPageLoaded() { 
    var jqxhrs = []; 

    $(window).bind("beforeunload", function (event) { 
     $.each(jqxhrs, function (idx, jqxhr) { 
      if (jqxhr) 
       jqxhr.abort(); 
     }); 
    }); 

    function registerJqxhr(event, jqxhr, settings) { 
     jqxhrs.push(jqxhr); 
    } 

    function unregisterJqxhr(event, jqxhr, settings) { 
     var idx = $.inArray(jqxhr, jqxhrs); 
     jqxhrs.splice(idx, 1); 
    } 

    $(document).ajaxSend(registerJqxhr); 
    $(document).ajaxComplete(unregisterJqxhr); 
}; 
+0

これは素晴らしいです。あなたのajax 'error'関数は中断のために呼び出されますので、コンソールエラーなどをログに記録している場合は' textStatus!= 'abort''をテストしてください。 – dhc

+0

私はこれの最新バージョンを追加しました。元のコードにはwhile()ループがあり、xhrオブジェクトが残っていないときにだけ終了しました。しかし、これはリストにnull xhrのエントリがあり、場合によってはエラーになります。 – yourpublicdisplayname

関連する問題