Ajax.Request no funciona con CORS en IE8 / 9, falla silenciosamente

Tengo una pregunta sobre el event handling CORS de Prototype con browseres IE <10. Observé que una llamada a Ajax.Request a una URL de origen cruzada fallaría silenciosamente en IE9, verificando los loggings de acceso para el server, está claro que la request nunca fue pareja hecho.

Después de algunas lecturas, parece que IE8 / 9 debe usar su propio object XDomainRequest para habilitar CORS, sin embargo, la function Ajax.getTransport de Prototype devuelve el object XMLHttpRequest que, según tengo entendido, no permite CORS en IE8 / 9.

He encontrado un parche para jQuery para el mismo problema, que me dice que esto también podría ser un problema con Prototype, simplemente no puedo encontrar nada publicado al respecto.

Implementé un poco de solución pirata:

 if (window.XDomainRequest) { // Use Microsoft XDR for IE8 and IE9 var xdr = new XDomainRequest(); xdr.open('POST', url); xdr.onload = function () { var data = xdr.responseText.evalJSON(); callback_handler(data.domain); }; setTimeout(function(){ xdr.send(); }, 0); } else { new Ajax.Request(url, { method: 'post', onSuccess: function(response) { var data = response.responseText.evalJSON(); callback_handler(data.domain); } } ); }; 

… pero me preguntaba si alguien (o Prototype) tenía una mejor solución.

One Solution collect form web for “Ajax.Request no funciona con CORS en IE8 / 9, falla silenciosamente”

Según la fuente del método Ajax.getTransport :

 var Ajax = { getTransport: function() { return Try.these( function() {return new XMLHttpRequest()}, function() {return new ActiveXObject('Msxml2.XMLHTTP')}, function() {return new ActiveXObject('Microsoft.XMLHTTP')} ) || false; } } 

Puede ver que getTransport intentará devolver una nueva instancia de cada uno de los transportes enumerados. Por lo tanto, puede implementar un XDomainRequest que agregue XDomainRequest antemano.

 var _getTransport = Ajax.getTransport; Ajax.getTransport = function() { return Try.these( function() { return new XDomainRequest() }, _getTransport ) || false; }; 

Si inserta este código en algún lugar entre include el prototipo y usar primero Ajax.Request, debería usar XDR sin problemas cuando sea posible.

NB Esto no se ha probado y es casi seguro que tenga algunos casos extremos: no estoy seguro de cuál es el comportamiento de XDR para las requestes del mismo dominio.

  • Descarga de files PDF a través de XHR Request
  • "Origen nulo no está permitido por Access-Control-Allow-Origin" en Chrome. ¿Por qué?
  • ¿Cómo puedo abrir un file JSON en JavaScript sin jQuery?
  • Solicitud de dominio cruzado sin CORS o JSONP
  • Parche de mono XMLHTTPRequest.onreadystatechange
  • d3.json no devuelve mi matriz de datos en D3 v4
  • Diferencia en jQuery con espacio de nombres XML y xhr.responseXML entre Opera y Firefox
  • fetch - Falta el límite en multipart / form-data POST
  • Impedir la networkingirección de Xmlhttprequest
  • Obtenga el progreso de carga de files individuales con XMLHttpRequest
  • INVALID_STATE_ERR: DOM Exception 11
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.