jQuery JSONP回调没有触发

我正在使用jQuery创建一个跨域AJAX请求,但我的回调函数没有触发(请参阅http://jsfiddle.net/zC8z5/ )。

function jsonpCallback(response){ $('#code').text(response.data); } $.ajax({ url: url, dataType: 'jsonp', error: function(xhr, status, error) { alert(error); }, success: function() { alert("success"); }, jsonp: false, jsonpCallback: 'jsonpCallback' }); 

根据文档:

从jQuery 1.5开始,将jsonp选项设置为false可防止jQuery将“?callback”字符串添加到URL或尝试使用“=?” 转型。 在这种情况下,您还应该显式设置jsonpCallback设置。 例如,{jsonp:false,jsonpCallback:“callbackName”}

但是,如果我没有指定回调而只是处理成功事件中的数据,那么它就可以工作(参见http://jsfiddle.net/2gBRT/ )。

 $.ajax({ url: url, dataType: 'jsonp', error: function(xhr, status, error) { alert(error); }, success: function(data) { jsonpCallback(data); } }); 

我是否误解了如何使用jQuery发出JSONP请求?

正如您摘录的文档中所述,如果服务器需要一个名为callback的参数,那么jQuery足够聪明,可以为您填写空白。 Bitbucket确实使用此参数名称,因此您获得的URL如下:

 https://api.bitbucket.org/.../?callback=jquery1234_5678 

jquery1234_5678实际上是一个自动生成的回调函数名。 Bitbucket然后返回如下内容:

 jquery1234_5678({ "node": "someId", "path": "filename", "data": "content" }) 

所以函数被调用。 此外,您可以简化( 演示 )成功部分:

 success: jsonpCallback 

如果Bitbucket期望一个不同的参数名称,你可以使用它作为jsonp的值。 例如,如果你通过了:

 jsonp: "functionName" 

URL看起来像这样:

 https://api.bitbucket.org/.../?functionName=jquery1234_5678 

但反应会是一样的。

如果你不希望jQuery生成函数名,你只需要jsonpCallback