jQuery JSONP回调没有触发

时间:2012-02-11 07:10:02

标签: 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'
});

根据文档:

  

从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请求?

1 个答案:

答案 0 :(得分:7)

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

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

jquery1234_5678实际上是一个自动生成的回调函数名称。 Bitbucket然后返回类似的东西:

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

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

success: jsonpCallback

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

jsonp: "functionName"

网址如下所示:

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

但反应是一样的。

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