Jquery $.ajax falla en IE en llamadas entre dominios
Estoy realizando una solicitud entre dominios usando $.ajax
. Funciona en Firefox y Chrome, pero no realiza una llamada en IE 7 u 8. ¿Alguien puede decirme qué hay de malo en lo siguiente?
- He usado JSON y JSONP (que dejé de usar debido a algunas restricciones personalizadas).
- Ya estoy usando
Allow-access-control-origin
el encabezado en mi sitio. (Sin ellos, Chrome y Firefox no realizaban solicitudes exitosas). - Ya probé https://developer.mozilla.org/en/http_access_control
Código:
$.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);
}
});
Probé varios consejos presentes en varios sitios, pero todavía no tuve suerte.
Para IE8 e IE9 es necesario utilizar XDomainRequest (XDR). Si miras a continuación, verás que tiene un formato similar al de $.ajax. Hasta donde me ha llegado mi investigación, no puedo hacer que este dominio cruzado funcione en IE6 y 7 (todavía estoy buscando una solución para esto). XDR apareció por primera vez en IE8 (también está en IE9). Básicamente, primero, pruebo 6/7 y no hago AJAX.
IE10+ es capaz de operar entre dominios normalmente como todos los demás navegadores (felicidades Microsoft... suspiro)
Después de eso, el else if prueba 'XDomainRequest en la ventana (aparentemente mejor que el rastreo del navegador) y realiza la solicitud JSON AJAX de esa manera; de lo contrario, ELSE lo hace normalmente con $.ajax.
¡¡Espero que esto ayude!! Me tomó una eternidad entender todo esto originalmente.
Información sobre el objeto 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);
}
});
}
}
¿Podría comprobar si el problema con IE se basa en no definir zonas de seguridad para permitir solicitudes entre dominios? Consulte esta página de Microsoft para obtener una explicación.
OTOH, esta página menciona que IE7 y versiones anteriores no pueden realizar llamadas entre dominios, pero IE8 puede, usando un objeto diferente a XMLHttpRequest, el que usa JQuery. ¿Podrías comprobar si XDomainRequest funciona?
EDITAR (22/08/2013)
El segundo enlace está inactivo, así que escribo aquí parte de su información, extraída de Wayback Machine :
Solicitud de dominio X compatible: IE8
En lugar de implementar la versión CORS de XMLHttpRequest, el equipo de IE optó por su propio objeto de propiedad, llamado XDomainRequest. El uso de XDomainRequest se ha simplificado a partir de XMLHttpRequest, al generar más eventos (siendo onload quizás el más importante).
Esta implementación tiene algunas limitaciones. Por ejemplo, las cookies no se envían cuando se utiliza este objeto, lo que puede ser un dolor de cabeza para las sesiones basadas en cookies en el lado del servidor. Además, no se puede configurar ContentType, lo que plantea un problema en ASP.NET y posiblemente en otros lenguajes del lado del servidor (consulte 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();
Jquery hace esto por usted, lo único es configurar $.support.cors = true;
Luego, la solicitud entre dominios funciona bien en todos los navegadores para los usuarios de jquery.