jQuery JSONP回调没有触发

jQuery JSONP Callback not firing

我正在使用jquery发出一个跨域Ajax请求,但我的回调函数没有启动(请参见http://jsfiddle.net/zc8z5/)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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'
});

根据文件:

As of jQuery 1.5, setting the jsonp option to false prevents jQuery
from adding the"?callback" string to the URL or attempting to use
"=?" for transformation. In this case, you should also explicitly set
the jsonpCallback setting. For example, { jsonp: false, jsonpCallback:
"callbackName" }

但是,如果我不指定回调,而只在成功事件中处理数据,它就可以工作(请参见http://jsfiddle.net/2gbrt/)。

1
2
3
4
5
6
7
8
9
10
$.ajax({
    url: url,
    dataType: 'jsonp',
    error: function(xhr, status, error) {
        alert(error);
    },
    success: function(data) {
        jsonpCallback(data);
    }
});

我是否误解了如何使用jquery发出jsonp请求?


正如您摘录的文档中所指出的,如果服务器希望得到一个名为EDCOX1(0)的参数,jQuery就足够智能为您填充空白。BitBucket确实使用了这个参数名,因此您可以得到如下的URL:

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

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

1
2
3
4
5
jquery1234_5678({
   "node":"someId",
   "path":"filename",
   "data":"content"
})

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

1
success: jsonpCallback

如果bitback需要一个不同的参数名,您可以将其用作jsonp的值。例如,如果您通过了:

1
jsonp:"functionName"

URL看起来像:

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

但反应是一样的。

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