使用jquery jsonp返回错误回调函数未被调用

时间:2013-10-14 00:35:51

标签: jquery callback jsonp jquery-1.10

我有以下working example,我试图通过jquery请求获取http://detectlanguage.com。由于这将是一个跨域请求,我正在使用jsonp。

以下a link in MSDN提出了类似的请求,其中jsonp是最佳选择。

一切都很好,除了页面抛出错误Error: myCallback was not called,我从服务器得到的响应如下:

{"data":
  {"detections":[
    {"language":"ca",
     "isReliable":false,
     "confidence":0.14992503748125938
    },
    {"language":"en",
     "isReliable":false,
     "confidence":0.00 8103727714748784
    }]
   }
}

我一直在stackoverflow中搜索有关jsonp的答案,但还没有让它工作。

非常感谢任何帮助

已更新

包括AJAX调用

$.ajax({
    url: 'http://ws.detectlanguage.com/0.2/detect',
    data: {
        q: $('#hi').val(),
        key:'demo'
    },
    jsonpCallback: 'myCallback',
    dataType: "jsonp",
    success: myCallback,
    error: function(e,i,j){
         $('#results').html(j)
    }
});

我还有一个名为myCallback的javascript函数:

function myCallback(response){
    alert(response.data)
}

2 个答案:

答案 0 :(得分:4)

响应似乎不是jsonp,jsonp响应应该是 javascript 。以下是适用于我的代码。

ajax请求:

 $.ajax({
            crossDomain: true,
            type:"GET",
            contentType: "application/json; charset=utf-8",
            async:false,
            url: "http://<your service url here>/HelloWorld?callback=?",
            data: {projectID:1},
            dataType: "jsonp",                
            jsonpCallback: 'fnsuccesscallback'
        });

服务器端代码返回jsonp(c#):

 public void HelloWorld(int projectID,string callback)
    {

        String s = "Hello World !!";
        StringBuilder sb = new StringBuilder();
        JavaScriptSerializer js = new JavaScriptSerializer();
        sb.Append(callback + "(");
        sb.Append(js.Serialize(s));
        sb.Append(");");
        Context.Response.Clear();
        Context.Response.ContentType = "application/json";
        Context.Response.Write(sb.ToString());
        Context.Response.End();
    }

答案 1 :(得分:0)

我也花了很长时间来寻找答案。我的解决方案与服务有关,而不是ajax调用或jQuery。具体而言,需要设置服务以允许使用web.config中的此设置进行跨域访问:

<system.serviceModel>
<bindings>
  <webHttpBinding>
    <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
  </webHttpBinding>
</bindings>  

...

  <endpoint address="../YourService.svc"
  binding="webHttpBinding"
  bindingConfiguration="webHttpBindingWithJsonP"
  contract="YourServices.IYourService"
  behaviorConfiguration="webBehavior" />