2009-10-29 6 views

Respuesta

67

Para referencia futura, CORS todas las funciones de detección debería ser algo como esto:

//Detect browser support for CORS 
if ('withCredentials' in new XMLHttpRequest()) { 
    /* supports cross-domain requests */ 
    document.write("CORS supported (XHR)"); 
} 
else if(typeof XDomainRequest !== "undefined"){ 
    //Use IE-specific "CORS" code with XDR 
    document.write("CORS supported (XDR)"); 
}else{ 
    //Time to retreat with a fallback or polyfill 
    document.write("No CORS Support!"); 
} 

Puede try this test live using JSBin y ver la respuesta correcta en el IE, Firefox, Chrome, Safari y Opera.

Existen algunos casos extremos en entornos no navegadores que soportan XHR entre dominios pero no XHR2/CORS. Esta prueba no tiene en cuenta esas situaciones.

+9

Debe mencionar que XDomainRequest solo admite solicitudes GET y POST. Si el servidor también depende de PUT o DELETE, XDomainRequest fallará. – McFarlane

+2

XDR también admite solicitudes de dominio cruzado de 'http' a' https'. Consulte [XDomainRequest - Restricciones, limitaciones y soluciones] (http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx) – Boaz

+3

note, ie11 da falsos positivos, ya que no es compatible con CORS con imágenes en caché http://web.onassar.com/blog/2013/11/07/internet-explorer-11-and-cors-crossorigin-support/ – jedierikb

34

Según http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/ usted debería ser capaz de utilizar:

if ('withCredentials' in new XMLHttpRequest()) { 
    /* supports cross-domain requests */ 
} 

(Nota: hay un comentario en esa página que Chrome 2 no pasa esta prueba [a pesar de que es compatible con las solicitudes entre dominios] He probado. Chrome 3 y la prueba está pasando).

Tenga en cuenta que el hecho de que el navegador sea compatible con el cross-domain API no significa que el servidor de destino permitirá que la solicitud se complete.

+0

Intenté esto pero obtengo un falso positivo en Opera. Mi caso específico es, de hecho, cargar un archivo local desde un archivo local, que se puede activar al verificar una preferencia de seguridad ... sin embargo, no puedo decir si esta preferencia está realmente marcada o no sin intentarlo. – Okarin

4

Es posible que desee ver EasyXDM, que ajusta las peculiaridades del navegador cruzado y proporciona una API fácil de usar para comunicarse en secuencias de comandos del cliente entre diferentes dominios utilizando el mejor mecanismo disponible para ese navegador (por ejemplo, postMessage si está disponible, otro mecanismos si no).

Está claro que la biblioteca ha resuelto el problema de detección de capacidades del navegador, por lo que puede beneficiarse de su experiencia. :-)

1

IE8 también tiene el objeto XDomainRequest que se puede utilizar para recuperar RSS como texto que luego se puede analizar en DOM.

Cuestiones relacionadas