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.

  • leer en el file utf-8 (javascript XMLHttpRequest) da malos caracteres europeos
  • XMLHttpRequest en google-chrome no informa events de progreso
  • ¿Alguna forma de pasar el control de acceso-permitir-origen para el desarrollo en mi propio server?
  • Abortar el xmlhttprequest
  • POST HTTP utilizando XHR con encoding de transferencia fragmentada
  • WebKit "Se negó a configurar el encabezado inseguro 'content-length'"
  • Diferencia entre la request de AJAX y una request de browser habitual
  • fetch - Falta el límite en multipart / form-data POST
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.