我正在使用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'
});
Run Code Online (Sandbox Code Playgroud)
根据文档:
从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);
}
});
Run Code Online (Sandbox Code Playgroud)
我是否误解了如何使用jQuery发出JSONP请求?
正如您摘录的文档中所述,如果服务器需要调用一个参数callback,那么jQuery足够聪明,可以为您填写空白.Bitbucket确实使用此参数名称,因此您可以获得如下URL:
https://api.bitbucket.org/.../?callback=jquery1234_5678
Run Code Online (Sandbox Code Playgroud)
jquery1234_5678实际上是你的回调自动生成的函数名称.Bitbucket然后返回如下内容:
jquery1234_5678({
"node": "someId",
"path": "filename",
"data": "content"
})
Run Code Online (Sandbox Code Playgroud)
所以函数被调用.此外,您可以简化(演示)成功部分:
success: jsonpCallback
Run Code Online (Sandbox Code Playgroud)
如果Bitbucket期望一个不同的参数名称,你可以使用它作为jsonp的值.例如,如果你通过了:
jsonp: "functionName"
Run Code Online (Sandbox Code Playgroud)
URL看起来像:
https://api.bitbucket.org/.../?functionName=jquery1234_5678
Run Code Online (Sandbox Code Playgroud)
但反应会是一样的.
只有jsonpCallback在不希望jQuery生成函数名时才需要.