【问题标题】:jQuery JSONP Callback not firingjQuery JSONP 回调未触发
【发布时间】:2012-02-11 07:10:02
【问题描述】:

我正在使用 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: “回调名称”}

但是,如果我没有指定回调,而是只处理成功事件中的数据,它会起作用(请参阅http://jsfiddle.net/2gBRT/)。

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

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

【问题讨论】:

    标签: jquery


    【解决方案1】:

    正如您摘录的文档中所述,如果服务器需要一个名为 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

    【讨论】:

    • 大多数人使用 JSONP 来绕过 CORS。而且他们无权访问服务器。如果他们这样做了,为什么不只是启用 CORS 标头而不是麻烦地实现 JSONP 回调?
    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 2014-04-03
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2011-06-27
    • 2011-09-30
    相关资源
    最近更新 更多