$ .getJSON在IE9及以下版本中将undefined返回到成功回调

时间:2013-10-23 12:47:44

标签: javascript jquery ajax json

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

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

$.getJSON(url, success);

在Chrome,Firefox,IE10下,此代码运行正常 - getJSON点击URL(有效,不是跨域),返回200 OK并返回数据,通过通过你期望的成功功能。

但是在IE9及以下版本中,调用了成功回调,但未定义传递的响应参数。通过在IE开发工具中捕获网络流量,我可以看到呼叫到达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数据是有效的,所以这也不是问题。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

编辑:我发现其中一个更改服务器端是从我们用于提供请求的Nancy框架的版本0.17升级到版本0.20。我猜这可能会以某种微妙的方式影响标题,但我仍然没有找到确切的方法。

答案 2 :(得分:0)

游戏有点晚了,但我会为任何绊倒这个帖子的人分享我的解决方案:

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