【问题标题】:Get the jqXhr.responseText on a jQuery getJSON request using JSONP使用 JSONP 在 jQuery getJSON 请求上获取 jqXhr.responseText
【发布时间】:2026-01-19 03:10:01
【问题描述】:

我正在编写一个诊断站点来测试我们的服务器方法。
我希望看到的其中一件事是 HTTP 状态代码,以及返回的实际有效负载。

当我使用 $.ajax 发出 CORS 请求时,我可以看到 jqXhr.responseText 来查看有效负载,但是当我使用 $.getJSON 发出 JSONP 请求时,jqXhr.responseText 未定义。

将 $.getJSON 与 jsonp 一起使用时,有什么方法可以查看 HTTP 有效负载?

function callJavascript(url, callback) {
    var closedData;
    var jqXhr = $.getJSON(url, function (data) {
        closedData = data;
    })
    .success(function() {
        $('#statusCode').text(jqXhr.status); //200
        $('#statusText').text(jqXhr.statusText); //success
        //this is undefined
        $('#responseText').text(jqXhr.responseText); 
        callback(closedData);
    });
};


function someCall()
{
    var callback = function(data) {
        //snip... will pop UI with json object returned
    };
    callJavascript('http://myurl?callback=?', callback);
};

【问题讨论】:

    标签: jquery jsonp jqxhr


    【解决方案1】:

    由于弃用,我建议使用.done 而不是.success

    .success 回调(或.done)中有三个参数:解析的响应文本、状态文本和xhr 对象。

    function callJavascript(url, callback) {
        var closedData;
        $.getJSON(url, function (data) {
            closedData = data;
        })
        .done(function(parsedResponse,statusText,jqXhr) {
            $('#statusCode').text(jqXhr.status); //200
            $('#statusText').text(jqXhr.statusText); //success
            //this should not be undefined
            $('#responseText').text(jqXhr.responseText); 
            console.log(parsedResponse);
            callback(closedData);
        });
    };
    

    这是一个小提琴,您可以在其中看到完整的 console.log 参数。

    http://jsfiddle.net/SDUEj/

    【讨论】:

    • 是的,在那个 jsfiddle 中填充了 responseText,但仅在使用 jsfiddle 回显端点时。如果我将其更改为使用我的,则它是未定义的。我什至可以使用我的旧方法使用 /echo/jsonp/... 获取 responseText(其中 .success 在 jqXhr 附近关闭)。我能看到的唯一区别是,当转到我的 url 时,我是跨域的。这可能是 Chrome 中同源策略的一部分吗?
    • 示例:jsfiddle.net/collinsauve/5GQ6s 用跨域调用替换最后一行中的 myurl... responseText 将未定义
    • 在所有 Chrome、FF 和 IE 中使用相同的小提琴查看此行为
    • 对不起,我没有使用 jsonp。这是使用 jsonp 的更好示例。 jsfiddle.net/SDUEj/2 确认没有responseText。我怀疑这是因为它是 jsonp 请求而不是典型的 ajax 请求。它是使用<script> 标签制作的。我猜你可以使用 JSON.stringify(arguments[0]) 从返回的对象生成 responseText