7

jQueryでjsonpを使用しようとしていますが、動作に一貫性がありません。スクリプトが機能する場合と機能しない場合があります。理由がよくわかりません。

これは、Chromeによって表示される可能性のあるエラーです。

Uncaught TypeError: Property 'jQuery18208278296771459281_1362854738133' of object [object Object] is not a function

次の例では、アプリケーションがオンラインかどうかを確認するだけです。しかし、この一貫性のない動作は、他の同様のajax呼び出しで発生する可能性があります。

     $.ajaxSetup({
        error: function (req, status, ex) {},
        success: function (data, status, req) {},
        timeout: 2000,
        crossDomain: true,
        contentType: "application/json",
        dataType:"jsonp",
        url: "http://myUrl.com/ping.php?preventCache="+new Date()
    });
    return $.ajax();

サーバー側のPHPファイルも非常に単純です。

<?php
header("Content-Type: application/javascript; charset=UTF-8");
echo $_GET['callback'];
?> ({ "status": "online" })
4

3 に答える 3

15

この動作は、JSONP呼び出しがタイムアウトしたときに発生します(timeout: 2000行によると2秒です)が、タイムアウトが発生した後にデータが到着します。

JSONPは通常のXmlHTTPRequestを使用しません。JSONPを実行するために、jQueryはスクリプトタグをドキュメントに挿入し、スクリプトタグの読み込みを処理する一時的な関数を作成します(関数名はエラーメッセージ内の長いランダムな文字列です)。

タイムアウトが発生し、スクリプトの読み込みがまだ完了していない場合、jQueryは一時関数を破棄します。その後しばらくして、scriptタグの読み込みが終了し、その関数を呼び出そうとしますが、遅すぎます。関数は削除されました。したがって、エラー。

タイムアウトを延長することでエラーを減らすことができるかもしれませんが、基本的な問題は、スクリプトタグのロードをキャンセルできないことです。エラーが発生していない場合は、タイムアウトよりも少し長くかかる可能性が常にあります。私の知る限り、これに対するきちんとした解決策はありません。jQueryに、独自の関数を作成する代わりに、明示的に名前が付けられた関数をJSONPコールバックとして使用するように指示できますが、その場合は、自分でタイムアウトしたかどうかを追跡する必要があります。CORSを使用することもできますが、これは別のことです。

おそらくあなたの最善の策はそれと一緒に暮らすことです。

于 2013-11-21T05:34:49.657 に答える
5

あなたの質問はそれほど明確ではありません。同じコールバック関数名を2回使用しようとすると、同じエラーが発生していました。いずれにせよ、これはjqueryでjsonpを呼び出す方法です。

      var mycallback = 'c'+Math.floor((Math.random()*100000000)+1);
      $.ajax({
                   type: 'GET',
                    url: URL,
                    async: true,
                    jsonpCallback: mycallback,
                    contentType: "application/json",
                    dataType: 'jsonp'

       }).done(function(json){
           console.log(json);
                    callback(json);
       }).fail(function(f){
           console.log("f");
                    console.log(f.status);
       }).always(function(){
                   // console.log('complete');
      }); 
于 2013-03-22T08:32:11.407 に答える
2

スクリプトが同じAJAXリクエストを連続して複数回行っているかどうかを確認します。

2つのリクエストを同時に起動する障害のあるイベントハンドラーがあり、これにより同じ問題が発生しました。

($ .ajaxSetupを1回呼び出すと想定しています):ping呼び出しにキャッシュバスターを適用する予定のようですが、$。ajaxSetupで行うと、後続のすべてのリクエストでURLが修正されるため、逆の効果が生じる可能性があります。

于 2013-03-15T10:56:14.657 に答える