Lo siguiente funciona en todos los navegadores excepto IE (estoy probando en IE 9).
jQuery.support.cors = true;
...
$.ajax(
url + "messages/postMessageReadByPersonEmail",
{
crossDomain: true,
data: {
messageId : messageId,
personEmail : personEmail
},
success: function() {
alert('marked as read');
},
error: function(a,b,c) {
alert('failed');
},
type: 'post'
}
);
Tengo otra función que usa dataType: 'jsonp'
, pero no necesito ningún dato devuelto en esta llamada AJAX. Mi último recurso será devolver algunas tonterías envueltas en JSONP solo para que funcione.
¿Alguna idea de por qué IE está arruinando una solicitud CORS que no devuelve datos?
jquery
internet-explorer-9
cross-domain
jsonp
cors
Garrett
fuente
fuente
Respuestas:
Este es un error conocido con jQuery. El equipo de jQuery "no tiene planes de admitir esto en el núcleo y es más adecuado como complemento". (Ver este comentario ). IE no usa XMLHttpRequest , sino un objeto alternativo llamado XDomainRequest .
No es un plugin disponible para apoyar esto en jQuery, que se puede encontrar aquí : https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js
EDITAR La función
$.ajaxTransport
registra una fábrica de transportadores. Un transportador es utilizado internamente por$.ajax
para realizar solicitudes. Por lo tanto, supongo que debería poder llamar$.ajax
como de costumbre.$.ajax
Puede encontrar información sobre transportadores y extensiones aquí .Además, una versión quizás mejor de este complemento se puede encontrar aquí .
Otras dos notas:
Edición 2: problema de http a https
Fuente: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
fuente
http
ahttps
), los dominios (google.com
abing.com
), los subdominios (mail.google.com
amaps.google.com
) o los protocolos (google.com:80
- el puerto predeterminado agoogle.com:8080
) activarán una solicitud de "dominio cruzado". Básicamente todo antes del primero/
en su URL debe ser idéntico.Partiendo de la respuesta aceptada por @dennisg, logré esto con éxito usando jQuery.XDomainRequest.js de MoonScript.
El siguiente código funcionó correctamente en Chrome, Firefox e IE10, pero falló en IE9. Simplemente incluí el script y ahora funciona automáticamente en IE9. (Y probablemente 8, pero no lo he probado).
fuente
Puede encontrar instrucciones completas sobre cómo hacerlo utilizando el complemento "jQuery-ajaxTransport-XDomainRequest" aquí: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions
Este complemento es activamente compatible y maneja HTML, JSON y XML. El archivo también está alojado en CDNJS, por lo que puede colocar directamente el script en su página sin configuración adicional: http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest .min.js
fuente
El problema es que IE9 y versiones posteriores no son compatibles con CORS. XDomainRequest solo admite GET / POST y el
text/plain
tipo conten como se describe aquí: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspxEntonces, si desea usar todos los verbos HTTP y / o json, etc., debe usar otra solución. He escrito un proxy que se rebajará a proxy si se usa IE9 o menos. No tiene que cambiar su código en absoluto si está utilizando ASP.NET.
La solución está en dos partes. El primero es un script jquery que se engancha en el procesamiento jQuery ajax. Llamará automáticamente al servidor web si se realiza una solicitud crossDomain y el navegador es IE:
En su servidor web, debe recibir la solicitud, obtener el valor del encabezado http X-CorsProxy-Url y hacer una solicitud HTTP y finalmente devolver el resultado.
Mi publicación de blog: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/
fuente
Acabo de hacer todas las solicitudes JSONP porque era la única solución para todos nuestros navegadores compatibles (IE7 + y los habituales). Eso sí, su respuesta técnicamente funciona para IE9, por lo que tiene la respuesta correcta.
fuente
Basándose en la solución de MoonScript, podría intentar esto en su lugar:
https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js
El beneficio es que, dado que es una solución de nivel inferior, habilitará CORS (en la medida de lo posible) en IE 8/9 con otros marcos, no solo con jQuery. He tenido éxito al usarlo con AngularJS, así como con jQuery 1.xy 2.x.
fuente
Obtener un JSON entre dominios con jQuery en Internet Explorer 8 y versiones más recientes
Enlace muy útil:
http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later/
Puede ayudar con el problema de devolver json desde una solicitud de dominio X.
Espero que esto ayude a alguien.
fuente
Para resolver este problema, también verifique si tiene algunos .js incluidos en su archivo ajax llamado: Recibí un error de acceso denegado al incluir shadowbox.js en mi ajax.php
fuente
Estaba probando un servicio web CORS en mi máquina de desarrollo y recibía el mensaje de error "Acceso denegado" solo en IE. Firefox y Chrome funcionaron bien. ¡Resulta que esto fue causado por mi uso de localhost en la llamada ajax! Entonces, la URL de mi navegador era algo así como:
http: //my_computer.my_domain.local/CORS_Service/test.html
y mi llamada ajax dentro de test.html fue algo así como:
Todo funcionó una vez que cambié la llamada ajax para usar la IP de mi computadora en lugar de localhost.
La pestaña "Red" de la ventana de herramientas de desarrollo de IE también muestra la solicitud de OPCIONES de verificación previa de CORS seguida de XMLHttpRequest GET, que es exactamente lo que esperaba ver.
fuente
Actualice a principios de 2015. xDomain es una biblioteca ampliamente utilizada para admitir CORS en IE9 con codificación adicional limitada.
https://github.com/jpillora/xdomain
fuente
Intente usar jquery-transport-xdr jQuery plugin para solicitudes CORS en IE8 / 9.
fuente
Nota - Nota
no use " http://www.domain.xxx " o " http: // localhost / " o "IP >> 127.0.0.1" para URL en ajax. solo use la ruta (directorio) y el nombre de la página sin dirección.
estado falso:
estado verdadero:
fuente