28

jQueryを使用して、別のドメインにある私のサービスを呼び出して遊んでいます。サービスへの呼び出しが正常に行われ (デバッグ ポイントがトリップします)、正しい応答が返されます (トラフィックをスニッフィングします)。

私の問題は、主に成功と失敗のコールバックが起動されないことです。JSONP の使用時にエラー イベントが発生しないことを示す SO に関する他の投稿をいくつか読みました。成功イベントの場合もそうですか (おそらく、独自のコールバック関数を提供していると想定されているため)、または成功コールバックを起動する方法はありますか。前もって感謝します。

$.ajax({
  type: "GET",
  url: urlOnDiffDomain,
  async: false,
  cache: false,
  dataType: 'jsonp',
  data: {},
  success: function(data, textStatus) {
    alert('success...');
  },
  error: function(xhr, ajaxOptions, thrownError) {
   alert('failed....');
  }
}); 
4

5 に答える 5

19

大丈夫。将来誰かが知る必要がある場合に備えて...後から考えると、解決策はおそらく以前よりも明白だったはずですが、Web応答を応答ストリームに直接書き込む必要があります。単純に JSON の文字列を返すだけではうまくいきません。誰かがそれを構築してストリーミングする必要があります。あなたが実際にそうすれば、私の元の投稿のコードはうまくいきます。

サービスコードの例:

public void DoWork()
{
  //it will work without this, but just to be safe
  HttpContext.Current.Response.ContentType = "application/json"; 
  string qs = HttpContext.Current.Request.QueryString["callback"];
  HttpContext.Current.Response.Write(qs + "( [{ \"x\": 10, \"y\": 15}] )");
}

わかりやすくするために、これはクライアント側のコードです。

function localDemo(){
  $.getJSON("http://someOtherDomain.com/Service1.svc/DoWork?callback=?",
    function(data){
      $.each(data, function(i,item){            
        alert(item.x);
      });
  });
}

これを行うためのより良い方法があれば、私はすべての耳です. 他のすべての人にとっては、JSONP の WCF 4.0 にはネイティブ サポートの概念があることは知っています。また、セキュリティ上の理由から少しチェックしたいかもしれませんが、私はあまり調査していません。

于 2010-03-04T22:56:20.163 に答える
14

サーバーが応答すると、successコールバック メソッドが呼び出されます。この$.ajaxメソッドは、コールバック メソッドを呼び出して応答を処理する関数を設定しsuccessます。

メソッドが呼び出されない理由として最も可能性が高いのsuccessは、サーバーからの応答が正しくないことです。この$.ajaxメソッドはcallback、サーバーが JSONP 応答で関数名として使用するクエリ文字列の値を送信します。サーバーが別の名前を使用している場合、$.ajaxメソッドが設定した関数は呼び出されません。

サーバーがクエリ文字列の値を使用callbackして応答の関数名を設定できない場合は、$.ajaxメソッドがサーバーから期待する関数名を指定できます。プロパティjsonpCallbackをオプション オブジェクトに追加し、値をサーバーが応答で使用する関数の名前に設定します。

たとえば、$.ajaxメソッドが URL を使用してサーバーにリクエストを送信している場合http://service.mydomain.com/getdata?callback=jsonp12345、サーバーは次のような応答を返す必要があります。

jsonp12345({...});

サーバーがクエリ文字列を無視し、callback代わりに次のような応答を返す場合:

mycallback({...});

次に、オプション オブジェクトにプロパティを追加して、関数名をオーバーライドする必要があります。

$.ajax({
  url: urlOnDiffDomain,
  dataType: 'jsonp',
  data: {},
  success: function(data, textStatus) {
    alert('success...');
  },
  jsonpCallback: 'mycallback'
});
于 2010-03-04T16:05:00.147 に答える
0
    $.ajax({
                url:' <?php echo URL::site('ajax/editing?action=artistSeracher') ?>',
                dataType: "json",
                data: {
                    featureClass: "P",
                    style: "full",
                    maxRows: 12,
                    artist: request.term
                },
                success: function( data ) {
                    response( $.map( data, function( item ) {
                        return {
                            label: item.artist,
                            value: item.artist,
                            id: item.id
                        }
                    }));
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    alert(xhr.status);
                    alert(thrownError);
                  }
            });
于 2012-09-27T17:10:29.033 に答える
0

これはあなたの質問に対する完全な答えではありませんが、通りすがりの人がこれを知りたいと思うと思います:

WCF REST から JSONPを扱うときは、次を使用してみてください。

[JavascriptCallbackBehavior(UrlParameterName = "$callback")]

サービスの実装のため。これにより、すぐに使用できる JSONP が提供されます。

于 2012-07-30T10:15:03.777 に答える
0

試す

$.getJSON(urlOnDiffDomain, function(data, textStatus){
    alert('success...');
});

通常、私のために働きます。&callback=? を追加する必要があります。ここで、jQuery は JSONP で使用されるコールバックを自動的に置き換えます。

エラー コールバックはトリガーされませんが、次のようにグローバルな $.ajaxError を使用できます。

$('.somenode').ajaxError(function(e, xhr, settings, exception) {
    alert('failed');
});
于 2010-03-04T16:03:49.440 に答える