2011-06-24 25 views
16

私は、JSONP ajaxコールを使用して別のドメインのコンテンツを読み込みます。ユーザーがボタンを「マウスオーバー」すると、これらのすべてが実行されます。jQueryでJSONP ajaxリクエストを中止する

$ .ajax()呼び出しの戻り値をxhrオブジェクトとして取得し、ユーザーが「マウスオーバー」を発生させるたびにajax要求を中止することができます。しかし、JSONPのコールバック関数がまだ呼び出されているため、エラーが発生し、xhr.abort()メソッドがコールバック関数の呼び出しを妨げないと考えています。

私はtry {} catch(e){}で$ .ajax()呼び出しを囲んでみましたが、xhr.abort()メソッドを呼び出した後もエラーは続きます。

この例外を処理する方法はありますか?

発生した例外は、(Firebugのに応じて)このようなものです: jQuery16102234208755205157_1308941669256が機能

と例外の内部構造ではありません。このようなものです:から jQuery16102234208755205157_1308941669256({...私のJSONデータ異なるドメイン....})

+0

[jqueryを使ってjavascriptを使用して[Kill ajaxリクエストを複製する]可能性があります。(http://stackoverflow.com/questions/446594/kill-ajax-requests-using-javascript-using-jquery) – Neal

+3

これはそうではないと思いますこの質問はJSONP ajaxリクエストでjqxhr.abort()メソッドが呼び出された後の例外の防止についてのものであり、リクエスト自体の停止方法に関するものではありません。 –

+0

この質問に対する回答は、重複する質問http:// stackoverflowで見つけることができます。com/questions/9533848/aborting-jquery-jsonp-request-will-throw-error –

答えて

-2

jQuery 1.5では、すべてのAjax APIにネイティブXHRオブジェクトの周りにラッパーオブジェクトがあります。見てみましょう:あなたはJSONPコールは実際にできabort()

http://api.jquery.com/jQuery.ajax/#jqXHR

jqxhr.abort(); // should be what you're looking for 
+2

これは私が今使っているものです。これはajaxリクエストを中止します。しかし、このajaxリクエストはJSONPを使用します。私は "abort()"メソッドを使用した後、JSONPレスポンスを処理するためにjQueryによって内部的に生成されたjavascript関数が呼び出されますが、abortメソッドはその関数定義を削除するようです。処理することができました。 –

+0

これ以上の情報はありますか?ライブサンプル、例外メッセージ? –

11

基本的な答えは単純here与えられたものです。実際の質問は、不必要なコールバック呼び出しと表示されているエラーの両方を回避する方法です。

コールバックの周りにtry...catchを使用することはできません。非同期であるためです。あなたはjQueryの終わりからそれを捕らえなければならないでしょう、そして、jQueryは一般にコールバックからスローされた例外を処理しません。 (これについては、私の本のAsync JavaScriptで議論します)代わりにやりたいことは、各Ajax呼び出しに一意の識別子を使用し、成功コールバックが呼び出されたら、その識別子が呼び出し時と同じかどうかを確認します。私はあなたが$.ajaxに渡すものはコールバックでthisとして使われているオブジェクトに添付されているという事実を利用しています。ここ

var requestCount = 0; 
$.ajax(url, { 
    dataType: 'jsonp', 
    requestCount: ++requestCount, 
    success: function(response, code) { 
    if (requestCount !== this.requestCount) return; 
    // if we're still here, this is the latest request... 
    } 
}); 

:ここでは簡単な実装です。

jQueryがabort()を作ってくれればいいと思います。

1

jsonpStringは、jsonpリクエスト内のコールバック関数名をオーバーライドします。この値は 'callback ='の代わりに 'callback'の代わりに使用されます。 URL内のクエリ文字列の一部。

したがって{jsonp:'onJSONPLoad'}は、'onJSONPLoad=?'をサーバーに渡します。 jQuery 1.5以降、jsonpオプションをfalseに設定すると、jQueryは?callback文字列をURLに追加したり、変換に=?を使用しようとしません。この場合、明示的にjsonpCallbackの設定を行う必要があります。例えば、{ jsonp: false, jsonpCallback: "callbackName" }

http://api.jquery.com/jQuery.ajax/

jQueryが?callback=jQuery17109492628197185695_1339420031913を追加し、後であなたが持つことになりますので、このコールバックにパラメータとして要求データを設定します。

jQuery17109492628197185695_1339420031913({ 
    "status": 200, 
    "data": {your json} 
}) 

はURLを要求するために、追加のパラメータを設定することを避けるためにと呼び出しコールバック、このパラメータをajaxメソッドに追加します:

$.ajax({ 
    ... 
    jsonp:false, 
    ... 
}); 
0

Trevor Burnhamの答えはかなり良いですが、リクエスト数を追跡​​する代わりに、リクエストをXHRパラメータと比較するだけで済みます。前の要求が完了する前に、の「中絶」になり、再びdoRequestまたは_freeRequestを呼び出す

doRequest: function() { 
    this._freeRequest(); 

    this._request = $.getJSON(url + params + '&callback=?', function(response, status, xhr) { 
     if (this._request !== xhr) return; // aborted 

     // success 
    }.bind(this)).done(this._freeRequest.bind(this)); 
} 

_freeRequest: function() { 
    if (this._request) { 
     delete this._request; 
    } 
} 

this._requestが完全に削除されたり、別の要求されるのいずれかから、真なるためのif (this._request !== xhr)ラインを引き起こすことにより、要求と述べました。

1

ユーザーがリクエストにヌル保存されたオブジェクトをキャンセルした場合を

// user canceled 
theXHR = null; 

最後に

ちょうどどこかに保存し、要求にXHRオブジェクト

theXHR = $.ajax(.... 

を中止しないでください。応答を受け取る(successコールバック)コールバックwiレスポンスのXHRオブジェクトと保存されたオブジェクトを比較します。

function successCallback(data, textStatus, XHR) 
{ 
    if(theXHR !== XHR) 
    { 
     // user canceled; discard the response 
     return; 
    } 

    // process the response 
} 

jQueryエラーがありません。でも、通常のAjaxのリクエストのために、abort()に依存しない一般的なアドバイスとして


。あなたが送信された要求が処理され、それを停止する方法はありませんbacauseサーバー上のリソースを節約しませんどのような場合には

  1. 。そして、応答が戻ってきます。

  2. 一部の(古い)ブラウザでは、abort()が正しく処理されません。

ただ、 "キャッシュ" XHRオブジェクトとシナリオを自分でキャンセル扱い。

関連する問題