jQuery JSONP回调没有触发

Ben*_*ter 3 jquery

我正在使用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请求?

Mat*_*hen 7

正如您摘录的文档中所述,如果服务器需要调用一个参数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生成函数名时才需要.