web-dev-qa-db-ja.com

JSONPを使用してjquery成功関数が起動しない

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

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

$.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....');
  }
}); 
28
Sanjay Uttam

よし。誰かが将来知っておく必要がある場合...後から考えると、解決策はおそらくそれよりも明白であるはずですが、Web応答で応答に直接書き込む必要があります stream。 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にネイティブサポートの概念があることは知っています。また、セキュリティの目的で checking を少し実行することもできます。

19
Sanjay Uttam

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

successメソッドが呼び出されない最も可能性の高い理由は、サーバーからの応答が正しくないことです。 $.ajaxメソッドは、サーバーがJSONP応答で関数名として使用する必要があるcallbackクエリ文字列の値を送信します。サーバーが別の名前を使用している場合、$.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'
});
13
Guffa

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

JSONP from WCF REST を使用する場合は、次のように使用してください。

[JavascriptCallbackBehavior(UrlParameterName = "$callback")]

サービスの実装。これにより、すぐにJSONPが提供されます。

0
Learner

試す

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

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

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

$('.somenode').ajaxError(function(e, xhr, settings, exception) {
    alert('failed');
});
0
codecandies
    $.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);
                  }
            });
0
Darkhan