【问题标题】:$.getJSON returning undefined to success callback in IE9 and below$.getJSON 在 IE9 及以下版本中返回 undefined 到成功回调
【发布时间】:2013-10-23 12:47:44
【问题描述】:

我们遇到了一个关于 $.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 数据是有效的,所以这也不是问题。

【问题讨论】:

  • 如果你使用普通的XMLHttpRequest 会出现同样的问题吗?
  • @Qantas94Heavy 就像调用 $.ajax 一样?我刚刚编辑了问题以包含它 - 是的,我尝试过使用 $.ajax,同样的行为
  • 返回的数据是什么?
  • 你的 json 绝对有效吗? IE 对额外的逗号等不那么宽容。通过在 jsonlint.com 之类的内容中检查语法来仔细检查您的语法。
  • @HenryWilson 您使用的是 IE 浏览器工具还是实际的 IE9?使用浏览器工具时存在一些已知问题(您可以在其中选择所需 IE 版本的小下拉菜单),因为 IE 提供的各种模式从未真正完全代表旧版本。如果可以的话,启动一个虚拟机或其他东西,然后从那里尝试。

标签: javascript jquery ajax json


【解决方案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;

【讨论】:

  • 尝试了所有这些,没有任何区别。然而,我注意到脚本中使用 getJSON 对不同服务的另一个调用工作正常,而另一个调用相同问题服务的页面现在也无法在 IE9 下工作,这让我怀疑它实际上是服务器端的东西。如果我找到它,我会报告......
  • 查看下面的答案,原来这与服务器返回的内容类型有关(尽管我仍然不是 100% 知道发生了什么变化,或者 IE 为何对它们大发雷霆)。跨度>
【解决方案2】:

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

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

【讨论】:

  • 我遇到了同样的问题。这太烦人了。您能否更具体地说明供应商特定的 JSON 内容类型是什么?
  • @user2483724 供应商特定的内容类型如下所示:application/vnd.mycompany.mytype+json;版本=1。您可以使用它们更明确地指定在您的域上下文中传输的数据类型,以及版本资源。有更多细节here,并在网络上加载更多
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2018-07-19
    • 2018-05-16
    • 2023-03-20
    • 2014-06-29
    相关资源
    最近更新 更多