带CORS的IE9 jQuery AJAX返回"访问被拒绝"

Gar*_*ett 123 jquery jsonp cross-domain cors internet-explorer-9

以下适用于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'
            }
        );
Run Code Online (Sandbox Code Playgroud)

我有另一个使用的函数dataType: 'jsonp',但我不需要在这个AJAX调用上返回任何数据.我的最后一招将是返回JSONP中包含的一些乱码,以使其正常工作.

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

den*_*isg 149

这是jQuery的一个已知错误.jQuery团队"没有计划在核心中支持这个,并且更适合作为插件." (见评论).IE浏览器无法使用XMLHttpRequest的,但命名的替代对象XDomainRequest.

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

编辑 该功能$.ajaxTransport注册运输工厂.甲转运用于内部$.ajax执行请求.因此,我认为你应该$.ajax像往常一样打电话.有关运输商和延伸的信息$.ajax可以在这里找到.

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

另外两个说明:

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

编辑2:http到https问题

请求必须以与托管页面相同的方案为目标

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

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

  • 插件的"更好的版本"是天生的; 我只是将它包含在我的页面中并自动修复了我的$ .ajax调用:)当然,假设你有[所有必要的标题](http://stackoverflow.com/questions/5750696/how-to-get -a-cross-origin-resource-sharing-cors-post-request-working)到位. (12认同)
  • 要添加到dennisg的答案,xdr.js有一个错误 - 不会按原样调用ajaxTransport回调.我必须根据http://stackoverflow.com/questions/12481560/custom-ajaxtransport-function-without-specified-datatype-is-not-firing-at-all更改它(添加"+*"作为第一个ajaxTransport调用的参数). (5认同)
  • jQuery.XDomainRequest.js确保当前页面和远程页面都是http或https.这是否意味着您无法从http页面调用https API? (4认同)
  • @Aaron,加入@ HariKaramSingh的评论:改变协议(`http`到`https`),域名(`google.com`到`bing.com`),子域名(`mail.google.com`到`maps. google.com`)或协议(`google.com:80`--"google.com:8080"的默认端口)都将触发"跨域"请求.基本上,URL中第一个`/`之前的所有内容都必须相同. (3认同)
  • 值得注意的是,链接到moonscripts github repo的代码是一个不起作用的旧版本.请务必获取最新版本:https://raw.github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest/master/jQuery.XDomainRequest.js (2认同)
  • @Aaron当我添加使用`https`的有点API时,我遇到了IE问题.因为页面本身是`http`,所以IE不会允许它. (2认同)

Jac*_*sey 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]);
            }
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

  • jQuery.XDomainRequest.js插件正是我所需要的!我无法让iexhr.js插件适用于HTTP基本身份验证背后的请求,但XDomainRequest就像一个魅力! (3认同)
  • 同样的问题,以同样的方式解决.谢谢@Moonscript (2认同)

Moo*_*ipt 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