繁体   English   中英

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

[英]$.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM