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

我正在使用$.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); } }); 

我已经尝试了多个网站提供的各种提示,但没有运气。

你能否检查IE的问题是否依赖于不定义安全区域来允许跨域请求? 请参阅此微软页面的解释。

OTOH, 这个页面提到IE7和eariler不能跨域调用,但是IE8可以使用与XMLHttpRequest不同的对象,一个JQuery使用。 你可以检查,如果XDomainRequest的作品?

编辑(2013-08-22)

第二个链接是死的,所以我在这里写一些信息,从backback机器 :

XDomainRequest支持:IE8

IE团队并没有实现XMLHttpRequest的CORS版本,而是自带了一个名为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(); 

对于IE8和IE9,您需要使用XDomainRequest(XDR)。 如果你看下面你会看到它的格式与$ .ajax类似。 至于我的研究得到了我,我不能得到这个跨域在IE6和7工作(仍然在寻找解决这个问题)。 XDR第一次出现在IE8中(也是在IE9中)。 所以基本上首先,我testing了6/7,没有AJAX。

IE10 +能够像所有其他浏览器一样正常进行跨域(祝贺微软…叹气)

之后,如果testing'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); } }); } } 

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

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

这个1.4kb的插件可以在Internet Explorer 8和9中正常工作

在jQuery之后join插件,并像平常一样调用你的ajax请求。 没有别的要求。

  • 插件GitHub回购和安装说明

添加额外的传输到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跨域AJAX请求失败。

干杯。

对于那些使用jQuery 2.0(我知道我可以)仍然存在这个问题的人来说,Jay Dave编写了最好的jQuery解决方法,但是我仍然有一些东西要添加到他的代码中:

  • 请确保您使用相同的协议来处理请求(HTTP – > HTTP或HTTPS – > HTTPS),Ayush Gupta提供了一个知道问题的链接
  • 用一个无操作函数处理“进行中”事件(这会阻止IE在接收到来自服务器的第一位之后提出请求。

完整的代码如下:

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

注意,添加

 $.support.cors = true; 

足以迫使$ .ajax调用IE8的工作

只需添加“?callback =?” (或“&callback =?”)到您的url:

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

在进行调用时(其他所有设置都适用于跨域,如上所示),这将触发正确的JSONP格式。

更深入的解释可以在这里find答案。

@Furqan你能否让我知道你是否用HTTP POST方法testing了这个,

由于我也在处理同一种情况,但是我无法将数据发送到不同的域。

但是阅读完这个后很简单…只有一点你必须忘掉旧的浏览器。 我使用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); } 

微软一直在狡猾的(至less在IE)犁耙:

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

CORS在IE8中使用XDomainRequest。 但IE 8不支持预冲或请求authentication,而Firefox 3.5+,Safari 4+和Chrome都支持这种请求。

我在IE中有同样的问题,我通过replace解决了它:

 <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版本。

我在IE9中遇到类似的问题,其中一些CORS电话被中止,而另一些则不是。 我的应用程序也依赖于承诺接口,所以上面的XDomainRequestbuild议不完全是我所需要的,所以我添加了一个推迟到我的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 }); } } 

由于缺less格式问题很难说,但我认为我看到两个问题与ajax调用。

1)contentType的application / x-www-form-urlencoded应该用引号括起来

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