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, не определяя зоны безопасности, чтобы разрешать запросы на междоменные запросы? См. Эту страницу Microsoft для объяснения.

OTOH, на этой странице упоминается, что IE7 и eariler не могут выполнять междоменные вызовы, но IE8 может использовать другой объект, кроме XMLHttpRequest, один JQuery. Не могли бы вы проверить, работает ли XDomainRequest?

EDIT (2013-08-22)

Второе звено мертво, поэтому я пишу здесь часть его информации, взятой с машины обратного пути :

Поддерживается XDomainRequest: IE8

Вместо того, чтобы реализовывать версию XMLHttpRequest CORS, команда IE отправилась с собственным уместным объектом, названным XDomainRequest. Использование XDomainRequest было упрощено из XMLHttpRequest, поскольку у него было больше событий (с onload, возможно, самым важным).

Эта реализация имеет несколько ограничений, связанных с ней. Например, куки-файлы не отправляются при использовании этого объекта, что может быть головной болью для сеансов на основе файлов 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). Итак, в первую очередь, я тестирую 6/7 и не делаю AJAX.

IE10 + может выполнять кросс-домен, как и все другие браузеры (поздравляет Microsoft … вздох)

После этого else, если тесты для «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-плагин: jQuery Cross-Domain AJAX для IE8

Этот плагин 1.4kb работает сразу в Internet Explorer 8 и 9 .

Включите плагин после jQuery и вызовите ваш запрос 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 для запроса Cross Domain AJAX.

Приветствия.

Другие, приезжающие сюда, могли бы хорошо прочитать http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx, в которых говорится об ограничениях XDomainRequest

Для тех, у кого может все еще возникнуть проблема с использованием jQuery 2.0 (я знаю, что знаю), Джей Дейв написал лучший способ обхода jQuery, но у меня есть еще кое-что, чтобы добавить его код, а именно:

  • убедитесь, что вы используете один и тот же протокол для запросов (HTTP -> HTTP или HTTPS -> HTTPS), Ayush Gupta дал ссылку на информацию о проблемах
  • обрабатывать события onprogress с помощью функции no-op (это предотвратит отказ 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(); } }; }); } 

Просто добавьте «? Callback =?» (или «& callback =?») на ваш URL:

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

При выполнении вызовов (при условии, что все остальное установлено правильно для кросс-домена, как указано выше), это приведет к правильному форматированию JSONP.

Более подробное объяснение можно найти в ответе здесь .

@Furqan Не могли бы вы сообщить мне, протестировали ли вы это с помощью метода HTTP POST,

Поскольку я также работаю над такой же ситуацией, но я не могу отправить данные в другой домен.

Но после прочтения это было довольно просто … только вам нужно забыть о OLD-браузерах. Я даю код для отправки с помощью метода 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); } 

Примечание.

 $.support.cors = true; 

было достаточно для принудительного вызова $ .ajax для работы на IE8

Microsoft всегда вспахивает саморазрушающуюся (по крайней мере, в 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 поддерживают такие запросы.

У меня такая же проблема в IE, я решил ее, заменив:

  

к

  

Так что в основном обновите версию jquery.

У меня была аналогичная проблема в 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 }); } } 

Трудно сказать из-за отсутствия форматирования в вопросе, но я думаю, что вижу два вопроса с вызовом ajax.

1) приложение / x-www-form-urlencoded для contentType должно быть в кавычках

2) Должна быть запятая, разделяющая параметры contentType и async.

Interesting Posts
Давайте будем гением компьютера.