在跨域调用的IE中,Jquery $ .ajax失败

Fur*_*edi 64 jquery cross-domain

我正在使用跨域请求$.ajax.它适用于Firefox和Chrome,但不会在IE 7或8上发出呼叫.任何人都可以告诉我以下内容有什么问题吗?

  1. 我使用了JSON和JSONP(由于一些自定义限制,我停止使用它).
  2. 我已经Allow-access-control-origin在我的网站上使用标题了.(没有这些,Chrome和Firefox没有成功请求.)
  3. 我已经尝试过https://developer.mozilla.org/en/http_access_control

码:

$.ajax({
    type: 'GET',
    url: "http://anotherdomain.com/Service/GetControl?id=" + zoneID,
    cache: false,
    contentType: "application/x-www-form-urlencoded",
    async: false,
    beforeSend: function (request) {
        //alert('before send');
        //request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
        //request.setRequestHeader("X-PINGOTHER", "pingpong");
    } ,
    success: function (data, status) {
        //alert("Data returned :" + data);
        //alert("Status :" + status);
        if (status == "success" && data != "")
            $("#" + div.id).append(data);
        else
            $("#" + div.id).attr("style", "display:none;");
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert(textStatus);
        alert(errorThrown);
    }
});
Run Code Online (Sandbox Code Playgroud)

我尝试了多个网站上的各种提示,但还没有运气.

Mar*_*.io 63

对于IE8和IE9,您需要使用XDomainRequest(XDR).如果你看下面你会看到它与$ .ajax类似的格式.至于我的研究得到了我,我无法让这个跨域工作在IE6和7(仍在为此寻找解决办法).XDR首先出现在IE8中(它也在IE9中).所以基本上首先,我测试6/7并且不做AJAX.

IE10 +能够像所有其他浏览器一样进行跨域操作(恭喜微软......叹息)

之后,如果在窗口中测试'XDomainRequest(显然比浏览器嗅探更好)并且以这种方式执行JSON AJAX请求,那么其他方面ELSE通常使用$ .ajax进行测试.

希望这可以帮助!!永远地把我带走,让这一切都得到了解决

有关XDomainRequest对象的信息

// call with your url (with parameters) 
// 2nd param is your callback function (which will be passed the json DATA back)

crossDomainAjax('http://www.somecrossdomaincall.com/?blah=123', function (data) {
    // success logic
});

function crossDomainAjax (url, successCallback) {

    // IE8 & 9 only Cross domain JSON GET request
    if ('XDomainRequest' in window && window.XDomainRequest !== null) {

        var xdr = new XDomainRequest(); // Use Microsoft XDR
        xdr.open('get', url);
        xdr.onload = function () {
            var dom  = new ActiveXObject('Microsoft.XMLDOM'),
                JSON = $.parseJSON(xdr.responseText);

            dom.async = false;

            if (JSON == null || typeof (JSON) == 'undefined') {
                JSON = $.parseJSON(data.firstChild.textContent);
            }

            successCallback(JSON); // internal function
        };

        xdr.onerror = function() {
            _result = false;  
        };

        xdr.send();
    } 

    // IE7 and lower can't do cross domain
    else if (navigator.userAgent.indexOf('MSIE') != -1 &&
             parseInt(navigator.userAgent.match(/MSIE ([\d.]+)/)[1], 10) < 8) {
       return false;
    }    

    // Do normal jQuery AJAX for everything else          
    else {
        $.ajax({
            url: url,
            cache: false,
            dataType: 'json',
            type: 'GET',
            async: false, // must be set to false
            success: function (data, success) {
                successCallback(data);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 整个互联网的最佳答案,我能找到这个问题...... (5认同)
  • 如果只有我可以'标记为最喜欢'的答案而不是问题:) (2认同)

Luc*_*ano 32

你能否检查IE的问题是否依赖于不定义安全区域以允许跨域请求?有关说明,请参阅此Microsoft软件页面.

OTOH,这个页面提到IE7和eariler不能做跨域调用,但是IE8可以使用与XMLHttpRequest不同的对象,一个JQuery使用.你能检查XDomainRequest是否有效吗?

编辑(2013-08-22)

第二个链接已经死了,所以我在这里写一些信息,取自后卫机器:

XDomainRequest支持:IE8

IE团队没有实现XMLHttpRequest的CORS版本,而是使用了自己的专有对象,名为XDomainRequest.通过抛出更多事件(onload可能是最重要的),XMLHttpRequest简化了XDomainRequest的使用.

此实现有一些限制.例如,使用此对象时不会发送cookie,这可能是服务器端基于cookie的会话的头痛问题.此外,无法设置ContentType,这在ASP.NET和其他服务器端语言中可能会出现问题(请参阅http://www.actionmonitor.co.uk/NewsItem.aspx?id=5).

var xdr = new XDomainRequest();
xdr.onload = function() { alert("READY"); };
xdr.open("GET", "script.html");
xdr.send();
Run Code Online (Sandbox Code Playgroud)

  • @Furqan设置P3P标头与允许跨域请求无关.*response*标头涉及是否将某个cookie设置或阻止作为隐私风险. (2认同)

小智 23

Jquery为你做这件事,唯一的事就是设置$.support.cors = true;然后跨域请求在jquery用户的所有浏览器中都能正常工作.

  • $ .support.cors = true; - 即使使用最新的jquery直到约会,似乎在IE8中也不起作用. (12认同)
  • 对于IE 8或9,情况并非如此.您仍然需要使用XDomainRequest.简单地设置$ .support.cors = true是不够的. (11认同)
  • 如果你看一下这个问题被问到的日期,那时jquery不习惯支持那个属性,稍后会介绍它仍然没有通过设置为true来完成场景,有服务器端设置你也需要调整一下. (6认同)

Bra*_*ood 20

只需安装这个jQuery插件:用于IE8的jQuery跨域AJAX

这个1.4kb的插件可以立即在Internet Explorer 8和9中运行.

在jQuery之后包含插件,并正常调用你的ajax请求.没有其他要求.

  • 在jQuery 1.8.3的IE7-9中为我工作.这个插件非常难找.如果有人绊倒了这个,请将这个答案给予它应得的支持. (5认同)
  • 在IE8,jQuery 1.10.2上没有为我工作. (2认同)

Jay*_*ave 7

为IE添加额外的传输到jquery.(最后在脚本中添加此代码)

$.ajaxTransport("+*", function( options, originalOptions, jqXHR ) {

    if(jQuery.browser.msie && window.XDomainRequest) {

        var xdr;

        return {

            send: function( headers, completeCallback ) {

                // Use Microsoft XDR
                xdr = new XDomainRequest();

                xdr.open("get", options.url);

                xdr.onload = function() {

                    if(this.contentType.match(/\/xml/)){

                        var dom = new ActiveXObject("Microsoft.XMLDOM");
                        dom.async = false;
                        dom.loadXML(this.responseText);
                        completeCallback(200, "success", [dom]);

                    }else{

                        completeCallback(200, "success", [this.responseText]);

                    }

                };

                xdr.ontimeout = function(){
                    completeCallback(408, "error", ["The request timed out."]);
                };

                xdr.onerror = function(){
                    completeCallback(404, "error", ["The requested resource could not be found."]);
                };

                xdr.send();
          },
          abort: function() {
              if(xdr)xdr.abort();
          }
        };
      }
    });
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题,Jquery $ .ajax失败了跨域AJAX请求.

干杯.


Ayu*_*pta 5

其他人来到这里可能会很好地阅读http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx,其中讨论了XDomainRequest的局限性