16

私はJSONP ajax呼び出しを使用して別のドメインからコンテンツをロードしています.ユーザーがボタンに「マウスオーバー」すると、これらすべてが実行されます.

$.ajax() コール リターンを xhr オブジェクトとしてキャプチャし、それを使用して、ユーザーが「マウスオーバー」を引き起こすたびに ajax リクエストを中止することができます。しかし、JSONP コールバック関数は引き続き呼び出され、これによりエラーが発生します。これは、xhr.abort() メソッドがコールバック関数の呼び出しを妨げないためだと思います。

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

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

発生した例外は次のようになります (Firebug によると): jQuery16102234208755205157_1308941669256 は関数ではありません

そして、例外の内部構造は次のようになります: jQuery16102234208755205157_1308941669256({... my json data from a different domain....})

4

5 に答える 5

11

基本的な答えは、単にここabort()に示されているものです。実際には JSONP 呼び出しはできません。本当の問題は、不要なコールバック呼び出しと表示されているエラーの両方をどのように回避するかということです。

try...catchコールバックは非同期であるため、コールバックを使用することはできません。jQuery の最後からキャッチする必要があり、jQuery は通常、コールバックからスローされた例外を処理しません。(これについては、私の著書Async JavaScriptで説明しています。) 代わりに、各 Ajax 呼び出しに一意の識別子を使用し、成功のコールバックが呼び出されたときに、その識別子が作成時と同じかどうかを確認します。電話。簡単な実装を次に示します。

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...
  }
});

ここでは、渡すものはすべて、コールバックで$.ajax使用されるオブジェクトにアタッチされるという事実を利用しています。this

もちろん、 jQuery がabort()これを実行してくれるとよいのですが。

于 2012-04-03T19:12:47.140 に答える
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 メソッドに追加します。次jsonp:falseのようになります。

$.ajax({
  ...
  jsonp:false,
  ...
});
于 2012-06-14T13:49:25.363 に答える
0

Trevor Burnham の回答はかなり良いですが、リクエスト数を追跡​​する代わりに、リクエストを XHR パラメータと比較する必要があります。

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;
    }
}

前のリクエストが完了する前にdoRequest再度または1 回呼び出すと、削除されるか別のリクエストが完全に削除されるため、行が true になることによって、そのリクエストが「中止」されます。_freeRequestif (this._request !== xhr)this._request

于 2014-06-16T19:43:00.253 に答える
-3

jQuery 1.5 では、すべての Ajax API にネイティブ XHR オブジェクトのラッパー オブジェクトがあります。を見てみましょう:

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

 jqxhr.abort(); // should be what you're looking for
于 2011-06-24T19:04:36.353 に答える