我们遇到一个奇怪的问题,$ .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数据是有效的,所以这也不是问题。
答案 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没有,这导致服务器返回空数据。