使用 CORS 标头时,$.get 在 IE 中不起作用

Posted

技术标签:

【中文标题】使用 CORS 标头时,$.get 在 IE 中不起作用【英文标题】:$.get not working in IE when using CORS headers 【发布时间】:2013-05-28 16:34:19 【问题描述】:

我从 Forefox 中的 vbox Windows XP 安装转到 jquery $.get documentation。然后按 F12 进入 firebug 控制台并粘贴以下代码运行:

$.get("http://10.0.2.2/info.php"
 ,null,function(data)console.log(data);
).fail(function(e)console.log("ERROR:"+e.statusText);)

10.0.2.2/info.php 指向我电脑上的以下php文件:

<?php
header('Access-Control-Allow-Origin: *');
echo "howdie";
?>

这在 Firefox 中可以正常工作并显示“howdie”。但是,当打开 IE 8 时,转到$.get documentation page,按 F12,转到脚本标签并执行我得到的相同代码:

错误:没有传输

【问题讨论】:

Is there a jQuery solution that uses CORS when available and falls back to XDomainRequest on MSIE and JSONP on browsers with niether?的可能重复 【参考方案1】:

我相信 jQuery 选择不支持 IE 8/9 XDomainRequest 的原因是这些浏览器无法完全支持 CORS。例如,您不能使用 XDomainRequest 发送自定义标头,并且请求类型始终是 text/plain。

对于许多应用程序,这些限制无关紧要。我发现包含这个库可以让我在 IE 8/9 上支持 CORS,不仅可以使用 jQuery,还可以使用 AngularJS 和其他框架:

https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js

如果您首先包含 xhr-xdr-adapter,上述问题中的示例应该可以正常工作。

【讨论】:

【参考方案2】:

供日后参考;我将其解决为jQuery $.AJAX does not support CORS,您必须编写自己的传输来支持这一点。 (然后链接到死链接)

这是因为 jQuery 在可用时使用 XMLHttpRequest 对象,但 IE 8 和 9 XMLHttpRequest 不支持 CORS 标头并且需要 XDomainRequest。我认为这是 jQuery 中的一个错误。

两年前这是submitted to the jQuery team,有人认为这是一个错误,然后被忽略了。即使 xhr 请求应该支持实现 cors 标头,但他们决定不支持。

我完全同意 jQuery 页面上发布的以下评论:

必须同意@anonymous:jQuery 适用于各种各样的 浏览器不一致,这可能是其目的的一半( 另一半是简化复杂的操作)。这是经典 浏览器不一致:Chrome 和 Firefox 通过支持 CORS XMLHttpRequest; IE 改为使用 XDomainRequest。没有意义了 让它成为一个插件,而不是(比如说)处理 IE 的损坏 getAttribute 函数是一个插件。建议重新开放和 调度 1.6.1 或 1.6.2(尤其是 jQuery 现在有 jqXHR 概念)。

【讨论】:

谢谢! (这是我的评论。听起来很熟悉,然后我突然意识到......) :-) 有趣。我必须同意错误线程上的comment 43。如果 IE 中的 XDR 如此脆弱并且本身就有很多问题,那么 jQuery 甚至尝试使用它,对原生 XDR 问题/故障负责是否明智?在这种情况下,使用单独的插件而不是使其成为 jQuery Core 的一部分不是更有意义吗?考虑到上述问题的性质,这听起来确实很冒险。 是的,我阅读了更多内容,似乎 IE 8 和 9 中的 cors 实现太弱了,无法认真对待。因此,如果您想支持 IE 7 和 8 浏览器,最好坚持使用 JSONP。在某些情况下,您可能会摆脱有限的支持,但当设置 InPrivate 浏览时,IE 8 的评论会完全崩溃我。 文档中的警告会很好。任何对使用 cors 感兴趣的人都应该重新考虑他们是否计划支持 IE 9 及以下版本。

以上是关于使用 CORS 标头时,$.get 在 IE 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有授权标头的 GET 请求之前的 OPTIONS 请求在苗条框架 4 中不起作用

在 IE10 的 AJAX CORS 请求中添加自定义标头时,CORS 请求中止

CORS 标头在 MEAN 堆栈应用程序中不起作用

来自 IE 或 Firefox 的 CORS 请求中没有 Referer 标头

使用 CORS 的应用程序在 Azure 中不起作用

如何使用授权标头发出 GET CORS 请求