jQuery的$就在IE无法跨域调用jQuery的$就在IE无法跨域调用(Jquery $.ajax

2019-05-10 23:49发布

我做的使用跨域请求$.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);
    }
});

我曾尝试目前在多个网站上的各种技巧,但还没有运气。

Answer 1:

您可以检查是否有IE浏览器的问题依赖于没有界定安全区域,允许跨域请求? 请参阅此Microsoft网页作出解释。

OTOH, 此页提到,IE7和早期的教不能做跨域调用,但IE8可以使用不同的对象比XMLHttpRequest的,在一个jQuery使用。 你可以检查是否XDomainRequest工作?

编辑(2013年8月22日)

第二个环节是死了,所以我在这里写它的一些信息,从所拍摄的Wayback机器 :

XDomainRequest支持:IE8

而不是执行的XMLHttpRequest的CORS版本,IE团队已经用了有自己的分寸对象,名为XDomainRequest。 XDomainRequest的使用已经从XMLHttpRequest的简化,通过使甩(与onload事件也许是最重要的),更多的事件。

此实现具有附加了一些限制。 例如,使用对象,这对于在服务器端基于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(); 


Answer 2:

对于IE8和IE9,你需要使用XDomainRequest(XDR)。 如果你看看下面你会看到它在一种相似的格式为$阿贾克斯的。 至于我的研究已经得到了我,我不能让这个跨域在IE6和7个(还在寻找一个解决这个)。 XDR在IE8(它在IE9也)第一次出来。 因此,基本上第一,我测试的6/7,无所AJAX。

IE10 +能够正常做跨域像所有其他浏览器(恭喜微软...叹气)

之后,如果在窗口(明显高于浏览器嗅探更好),并做了JSON AJAX请求的方式试验“XDomainRequest,其他明智的人这样做它通常与$阿贾克斯的人。

希望这可以帮助!! 带我永远让这一切都想通了,原来

在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);
            }
        });
    }
}


Answer 3:

jQuery不会这样对你来说,唯一要做的就是设置$.support.cors = true; 然后跨域请求的jQuery用户所有的浏览器工作正常。



Answer 4:

只需安装这个jQuery插件: jQuery的跨域Ajax的IE8

这1.4kb的插件的工作原理就在Internet Explorer 8和9。

包括jQuery的后插件,并打电话给你的Ajax请求是正常的。 没有别的要求。

  • 插件GitHub的回购和安装说明


Answer 5:

额外的运输加入jQuery的IE浏览器。 (就在你的脚本在末尾添加该代码)

$.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();
          }
        };
      }
    });

这解决了我的问题与jQuery $就没有跨域AJAX请求。

干杯。



Answer 6:

其他人来这儿可能会做得很好看http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx其中谈到XDomainRequest的局限性



Answer 7:

对于任何人可能仍存在使用jQuery 2.0(我知道我这样做)这个问题,周杰伦写了戴夫最好的jQuery的解决方法,但我仍然有一些东西添加到他的代码,即:

  • 请确保您使用的请求(HTTP - > HTTP或HTTPS - > HTTPS)相同的协议,AYUSH古普塔给了一个链接,知道问题
  • 处理与无操作功能的“onprogress”事件(这将阻止IE它从所述服务器接收到所述第一比特之后abording请求。

完整的代码如下:

// add ajax transport method for cross domain requests when using IE9
if('XDomainRequest' in window && window.XDomainRequest !== null) {
   $.ajaxTransport("+*", function( options, originalOptions, jqXHR ) {
       // verify if we need to do a cross domain request
       // if not return so we don't break same domain requests
       if (typeof options.crossDomain === 'undefined' || !options.crossDomain) {
           return;
       }

        var xdr;

        return {
            send: function( headers, completeCallback ) {
                // Use Microsoft XDR
                xdr = new XDomainRequest();
                xdr.open("get", options.url); // NOTE: make sure protocols are the same otherwise this will fail silently
                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.onprogress = function() {};

                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();
            }
        };
    });
}


Answer 8:

只需添加“?回调=?” (或 “&回调=?”)到您的网址:

$.getJSON({
    url:myUrl + "?callback=?",
    data: myData,
    success: function(data){
        /*My function stuff*/        
    }
});

当进行通话(与其他一切正确设置跨域,如上),这将触发适当的JSONP格式。

更深入的解释可以在答案中找到这里 。



Answer 9:

@Furqan可否请你让我知道你是否测试过这个与HTTP POST方法,

因为我也工作在同一个样的状况,但我不能把数据上传到不同的领域。

但经过阅读这是很简单的......唯一的一点是你对旧的浏览器给忘了。 我给的代码与POST方法从同上面的URL发送为快速参考

function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
    xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
    xhr = new XDomainRequest();
    xhr.open(method, url);
} else {
    xhr = null;
}
return xhr;
}

var request = createCORSRequest("POST", "http://www.sanshark.com/");
var content = "name=sandesh&lastname=daddi";
if (request){
    request.onload = function(){
    //do something with request.responseText
   alert(request.responseText);
};

 request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            request.setRequestHeader("Content-length", content.length);
            request.send(content);
}


Answer 10:

请注意,添加

$.support.cors = true;

足以迫使$就呼吁对IE8工作



Answer 11:

微软总是犁弄巧成拙(至少在IE)沟:

http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/

CORS可与XDomainRequest在IE8。 但是,IE 8不支持而Firefox 3.5+和Safari 4+和Chrome都支持这样的请求预检或资格的请求。



Answer 12:

我在IE浏览器同样的问题,我解决它通过更换:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

所以基本上你的升级版本的jQuery。



Answer 13:

我曾在IE9类似的问题,在一些CORS电话被中止,而另一些则没有。 我的应用程序还依赖一个承诺接口,因此以上XDomainRequest建议不正是我需要的,所以我加了一个推迟到我的service.get解决方法IE9。 希望它可以给别人过这个问题跑有用。 :

    get: function (url) {
        if ('XDomainRequest' in window && window.XDomainRequest !== null) {
            var deferred = $.Deferred();
            var xdr      = new XDomainRequest();

            xdr.open("get", url);

            xdr.onload = function() {
              json = xdr.responseText;
              parsed_json = $.parseJSON(json);
              deferred.resolve(parsed_json);
            }

            xdr.send();
            return deferred;
        } else {
            return $.ajax({
                url: url,
                type: 'GET',
                dataType: 'json',
                crossDomain: true
            });
        }
    }


Answer 14:

这很难说,由于缺乏对问题的格式,但我想我看到Ajax调用两个问题。

1)应用程序/ X WWW的窗体-urlencoded为contentType中应该是在引号

2)应该有一个逗号分隔的contentType和异步参数。



文章来源: Jquery $.ajax fails in IE on cross domain calls