5

我们遇到了一个关于 $.getJSON 调用的奇怪问题,它似乎只影响旧版本的 IE。代码如下:

var success = function (response) {
     // do stuff
}

$.getJSON(url, success);

在 Chrome、Firefox、IE10 下,此代码运行良好 - getJSON 命中 URL(有效,并且不是跨域),返回 200 OK 并返回数据,如您所期望的那样传递给成功函数.

但是在IE9及以下,调用成功回调但传递的响应参数未定义。通过在 IE Dev Tools 中捕获网络流量,我可以看到调用到达 URL,返回 200 OK 并在响应正文中返回有效的 JSON。那么为什么在成功回调时会出现未定义的情况呢?

我尝试使用 $.ajax 调用来代替适当的参数,但我看到了相同的行为。下面的代码:

$.ajax({
    dataType: "json",
    url: url,
    success: success
};

我们正在使用 jQuery 1.7.2(我们在页面上获得的库之一在 jQuery 的较新版本下被破坏,因此是旧版本)。

编辑:刚刚尝试更新页面以使用 jQuery 1.10.1,并不能解决问题。

编辑 2:我已经确认通过 jsonlint.com 返回的 JSON 数据是有效的,所以这也不是问题。

4

3 回答 3

1

如果它正在缓存结果,则在请求之前将缓存设置为 false:

$.ajaxSetup({ cache: false });

如果它正在缓存结果,则使用 ajax 而不是 getJSON:

$.ajax({
    url: 'data.json',
    cache: false,
    dataType: 'json',
    success: function(data) {
        console.log('success', data);
    },
    error: function (request, status, error) {
        console.log('error', error);
    }
});

如果 mime 类型错误,则指定 dataType:

$.getJSON('data.json', 'json', function(data) {
    console.log('getJSON', data);
});

如果 mime 类型错误,则在服务器上指定 dataType:

header('Content-type: application/json');

如果是变量冲突,则重命名您的回调变量:

var success = function (newname) {
    console.log('success', newname);
}
$.getJSON(url, success);

如果它是跨源请求,那么您可以强制 jQuery 将其用于:

$.support.cors = true;
于 2013-10-23T23:51:56.023 回答
1

事实证明这根本不是 jQuery 问题——它与服务器返回的内容类型标头有关。无论出于何种原因(仍然不清楚究竟是什么改变导致了问题),服务器返回的媒体类型(尽管是普通的旧应用程序/json)在旧版本的 IE 下没有被 jQuery 正确解释。我对服务器端代码进行了更改以返回特定于供应商的 JSON 内容类型,并且代码现在可以再次运行。

编辑:在我看来,服务器端的更改之一是将我们用来服务请求的Nancy框架从 0.17 版升级到 0.20 版。我猜这可能以某种微妙的方式影响了标题,尽管我还没有确切地找到具体的方式。

于 2013-10-24T10:37:32.183 回答
0

游戏有点晚了,但我会为遇到此线程的任何人分享我的解决方案:

我有同样的问题,但原因却有点不同。我将标签传递给包含特殊字符的 getJSON url。现在 Chrome 会默默地为我转换这些字符,但 IE 没有,这导致服务器返回空数据。

于 2017-05-01T09:16:46.627 回答