123

以下适用于除 IE 之外的所有浏览器(我正在 IE 9 中进行测试)。

jQuery.support.cors = true;
...
        $.ajax(
            url + "messages/postMessageReadByPersonEmail",
            {
                crossDomain: true,
                data: {
                    messageId       : messageId,
                    personEmail     : personEmail
                },
                success: function() {
                    alert('marked as read');
                },
                error: function(a,b,c) {
                    alert('failed');
                },
                type: 'post'
            }
        );

我有另一个使用 的函数dataType: 'jsonp',但我不需要此 AJAX 调用返回的任何数据。我最后的手段是返回一些用 JSONP 包裹的乱码,只是为了让它工作。

任何想法为什么 IE 搞砸了一个不返回数据的 CORS 请求?

4

12 回答 12

150

这是 jQuery 的一个已知错误。jQuery 团队“没有计划在核心中支持这一点,并且更适合作为插件。” (见此评论)。IE 不使用XMLHttpRequest ,而是使用名为XDomainRequest的替代对象。

在 jQuery中有一个插件可以支持这个,可以在这里找到https ://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js

EDIT 该函数$.ajaxTransport注册一个运输工厂。传输器在内部用于执行$.ajax请求。因此,我认为您应该可以$.ajax像往常一样打电话。$.ajax可以在此处找到有关运输机和扩展的信息。

此外,可以在此处找到此插件的更好版本。

另外两个注意事项:

  1. XDomainRequest 对象是从 IE8 引入的,在以下版本中将不起作用。
  2. 从 IE10 开始,将使用普通的 XMLHttpRequest 支持CORS 。

编辑 2:http 到 https 问题

请求必须针对与托管页面相同的方案

此限制意味着如果您的 AJAX 页面位于 http://example.com,那么您的目标 URL 也必须以 HTTP 开头。同样,如果您的 AJAX 页面位于https://example.com,那么您的目标 URL 也必须以 HTTPS 开头。

来源:http: //blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

于 2012-04-19T16:14:42.880 回答
62

在@dennisg 接受的答案的基础上,我使用MoonScript的jQuery.XDomainRequest.js 成功地完成了这项工作。

以下代码在 Chrome、Firefox 和 IE10 中正常工作,但在 IE9 中失败。我只是简单地包含了脚本,它现在可以在 IE9 中自动运行。(可能是 8 个,但我还没有测试过。)

var displayTweets = function () {
    $.ajax({
        cache: false,
        type: 'GET',
        crossDomain: true,
        url: Site.config().apiRoot + '/Api/GetTwitterFeed',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function (data) {
            for (var tweet in data) {
                displayTweet(data[tweet]);
            }
        }
    });
};
于 2013-01-22T17:01:55.153 回答
16

可以在此处找到有关如何使用“jQuery-ajaxTransport-XDomainRequest”插件执行此操作的完整说明: https ://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions

该插件受到积极支持,可处理 HTML、JSON 和 XML。该文件也托管在 CDNJS 上,因此您可以直接将脚本拖放到您的页面中,无需额外设置: http ://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest .min.js

于 2013-06-17T18:01:42.233 回答
3

问题是IE9及以下不支持CORS。XDomainRequest 仅支持 GET/POST 和text/plain此处所述的内容类型:http: //blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

因此,如果您想使用所有 HTTP 动词和/或 json 等,则必须使用另一种解决方案。我编写了一个代理,如果使用 IE9 或更低版本,它将优雅地降级为代理。如果您使用的是 ASP.NET,则根本不必更改您的代码。

解决方案分为两部分。第一个是一个 jquery 脚本,它与 jQuery ajax 处理挂钩。如果发出跨域请求并且浏览器是 IE,它将自动调用网络服务器:

$.ajaxPrefilter(function (options, originalOptions, jqXhr) {
    if (!window.CorsProxyUrl) {
        window.CorsProxyUrl = '/corsproxy/';
    }
    // only proxy those requests
    // that are marked as crossDomain requests.
    if (!options.crossDomain) {
        return;
    }

    if (getIeVersion() && getIeVersion() < 10) {
        var url = options.url;
        options.beforeSend = function (request) {
            request.setRequestHeader("X-CorsProxy-Url", url);
        };
        options.url = window.CorsProxyUrl;
        options.crossDomain = false;
    }
});

在您的 Web 服务器中,您必须接收请求,从 X-CorsProxy-Url http 标头中获取值并执行 HTTP 请求并最终返回结果。

我的博文:http: //blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/

于 2014-04-24T11:07:23.193 回答
1

我刚刚提出了所有JSONP请求,因为它是我们所有支持的浏览器(IE7+ 和常规浏览器)的唯一解决方案。请注意,您的答案在技术上适用于 IE9,因此您有正确的答案。

于 2012-04-20T17:57:17.480 回答
1

基于 MoonScript 的解决方案,您可以尝试以下方法:

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

好处是,由于它是一个较低级别的解决方案,它将在 IE 8/9 上使用其他框架(而不仅仅是 jQuery)启用 CORS(尽可能)。我已经成功地将它与 AngularJS 以及 jQuery 1.x 和 2.x 一起使用。

于 2014-08-15T22:54:13.320 回答
0

在 Internet Explorer 8 和更新版本中使用 jQuery 获取跨域 JSON

非常有用的链接:

http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later/

可以帮助解决从 X 域请求返回 json 的麻烦。

希望这可以帮助某人。

于 2013-05-30T20:11:59.000 回答
0

要解决此问题,还要检查您的 ajax 文件中是否包含一些 .js 文件:I received Access denied error while including shadowbox.js in my ajax.php

于 2013-07-08T08:04:25.367 回答
0

我正在我的开发机器上测试 CORS Web 服务,并且仅在 IE 中收到“访问被拒绝”错误消息。Firefox 和 Chrome 运行良好。原来这是由于我在 ajax 调用中使用了 localhost 造成的!所以我的浏览器 URL 是这样的:

http://my_computer.my_domain.local/CORS_Service/test.html

我在 test.html 中的 ajax 调用类似于:

//fails in IE 
$.ajax({
  url: "http://localhost/CORS_Service/api/Controller",
  ...
});

一旦我将 ajax 调用更改为使用我的计算机 IP 而不是 localhost,一切正常。

//Works in IE
$.ajax({
  url: "http://192.168.0.1/CORS_Service/api/Controller",
  ...
});

IE 开发工具窗口“网络”选项卡还显示了 CORS Preflight OPTIONS 请求,后跟 XMLHttpRequest GET,这正是我所期望的。

于 2013-11-07T13:37:15.837 回答
0

更新至 2015 年初。xDomain 是一个广泛使用的库,可在 IE9 上以有限的额外编码支持 CORS。

https://github.com/jpilora/xdomain

于 2015-02-13T04:42:48.100 回答
0

尝试在 IE8/9 中对 CORS 请求使用jquery-transport-xdr jQuery 插件。

于 2015-10-06T17:21:03.647 回答
-1

注意——注意

不要在 ajax 中使用“ http://www.domain.xxx ”或“ http://localhost/ ”或“IP >> 127.0.0.1”作为 URL。仅使用不带地址的路径(目录)和页面名称。

虚假状态:

var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'http://www.example.com/dir/getSecurityCode.php', true);
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);

真实状态:

var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'dir/getSecurityCode.php', true);   // <<--- note
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);
于 2015-06-28T21:03:49.230 回答