[英]$.getJSON returning undefined to success callback in IE9 and below
我们遇到了一个奇怪的问题,$ .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:我已经确认返回的JSON数据是通过jsonlint.com有效的,所以这也不是问题。
如果它正在缓存结果,则在请求之前将缓存设置为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;
事实证明这不是一个jQuery问题 - 它与服务器返回的内容类型标题有关。 无论出于何种原因(仍然不清楚究竟是什么原因导致问题)服务器返回的媒体类型(尽管是普通的旧应用程序/ json)在旧版本的IE下没有被jQuery正确解释。 我对服务器端代码进行了更改,以返回特定于供应商的JSON内容类型,现在代码再次运行。
编辑:我发现其中一个更改服务器端是从我们用来提供请求的Nancy框架的版本0.17升级到版本0.20。 我猜这可能会以某种微妙的方式影响标题,但我仍然没有找到确切的方法。
游戏有点晚,但我会为任何绊倒这个线程的人分享我的解决方案:
我有同样的问题,但原因结果有点不同。 我将标签传递给包含特殊字符的getJSON网址。 现在Chrome默默地为我转换这些字符,但IE没有,这导致服务器返回空数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.