2012-03-02 14 views
7

jQueryを使用して簡単な自動募集(オートコンプリート)プラグインを作成しています。残念ながら私はjsonpを使用する必要があります。それは大丈夫、それは動作しますが、私はエラーをスローされます要求を中止しています。jQueryのJSONPリクエストの中止によりエラーが発生する

Uncaught TypeError: Property 'jQuery171036404498340561986_1330693563756' of object [object Window] is not a function 

JSON、XMLまたはその他の要求とのコード

if(xhr) {xhr.abort()}; 
xhr = $.ajax({ 
    url: "someurl/getmedata", 
    type: 'get', 
    dataType: 'jsonp', 
    data: {q: "query"}, 
    success: function(results) {}, 
    error: function() {} 
}) 

クラシックな方法が正常に動作しますがあります。

Anny suggestion?

+0

http://stackoverflow.com/questions/6472509/abort-jsonp-ajax- jqueryのリクエスト)、その質問は決して適切に答えられていませんでした。 –

答えて

14

JSONPない使用XMLHTTPRequestを行いますが、実際にクロスドメインリクエストを行うことができるように、文書内<script>タグを作成します。

JSONPリクエストを中止することはできません。

それは$.ajax()マニュアルに記載されている。このようJSONPとクロスドメインGET要求などのAjaxリクエストの

いくつかの種類、はXHRを使用しないでください。そのような場合、コールバックに渡されるXMLHttpRequestおよびtextStatusパラメータは未定義です。

jQuery 1.5+では、以前はXHRオブジェクトを$ .ajax()から戻していましたが、XHRオブジェクトをカプセル化するスーパーセットjqXHRオブジェクトを返します。

搬送機構jqXHRオブジェクトが可能ネイティブXHRの機能をシミュレートするのXMLHttpRequest以外(JSONP要求については、例えば、スクリプトタグ)である場合。

したがって、オブジェクトを返しますが、実際には.abort()のように一部のfunctionnalitiesは使用できません。


プラグインjQuery-JSONPは手動でJSONPリクエストを中止する可能性を提供しているようです。私は自分で使ったことはありませんが、試してみる価値があります。

+0

それを入手してください。グローバルコンテキストで欠落した関数を処理する方法は他にありますか? – Schovi

+1

私はプラグイン[jquery-jsonp](http://code.google.com/p/jquery-jsonp/)へのリンクを追加しました。これはjsonpリクエストを中止する可能性を提供するようです。 –

+0

ありがとうございます。やってみます! – Schovi

4

jQueryは、<script>タグを使用してJSONPを実装しています。スクリプトタグの読み込みを中止することはできません。

0

まず、何らかのシーケンシングロジックを使用します。これにより、あなたの最後の要求が古いものよりも優先されます。 ここにはexampleがあります。

また、あなたはこれらの$.ajaxの設定を利用することができます。

timeout:は、リクエストごとに時間制限を設定し、要求が黙って失敗しないようにします。

beforeSend:通話を行う前に条件を確認してください。シーケンスヘルパーを補完します。

As of jQuery 1.5, the beforeSend option will be called regardless of the type of request. 

例:この質問は、以前[jQueryを使って中止JSONPのAJAXリクエスト(の重複がある

function updateResults() { 

    // Init counter & record current request 
    if (!window.reqSeq) window.reqSeq = 0; 
    window.reqSeq +=1; 
    var thisRequest = window.reqSeq; 

    $.ajax({ 
    url: [..], 
    crossDomain: true, 
    contentType: "application/json", 
    dataType: 'jsonp', 
    timeout: 5000, // give 5 seconds of margin 
    data: { [..] }, 
    beforeSend: function() { 
     if(thisRequest < window.reqSeq) { 
     return false; 
     } 
    }, 
    success: function(data, textStatus, jqXHR) { 
     if(thisRequest < window.reqSeq) { 
     return; 
     } 
     else print(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // it'll be called on timeout (error) and beforeSend (abort) 
     print(textStatus); 
    } 
    }); 

} 
関連する問題