2009-10-29 88 views

回答

67

以供将来参考,充满CORS特征检测应该是这个样子:

//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!"); 
} 

您可以try this test live using JSBin,看看在IE,火狐,Chrome,Safari和Opera适当的反应。

在非浏览器环境中有一些边缘情况,支持跨域XHR但不支持XHR2/CORS。这个测试没有考虑到这些情况。

+9

您应该提到,XDomainRequest仅支持GET和POST请求。如果服务器也依赖PUT或DELETE,则XDomainRequest将失败。 – McFarlane 2012-11-16 08:54:22

+2

XDR也支持不从'http'到'https'的跨域请求。请参阅[XDomainRequest - 限制,限制和解决方法](http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx) – Boaz 2013-12-12 17:38:14

+3

note,ie11给出误报,因为它不支持使用缓存映像的CORS http://web.onassar.com/blog/2013/11/07/internet-explorer-11-and-cors-crossorigin-support/ – jedierikb 2014-01-05 03:16:27

34

根据http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/你应该能够使用:

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

(注:有是页面上的镀铬2未能做到这一点[虽然它不支持跨域请求]我测试了评论。 Chrome 3和测试正在通过。)

请记住,仅仅因为浏览器可能支持cross-domain API并不意味着目标服务器将允许请求完成。

+0

我试过这个,但是我在Opera上得到了一个误报。我的具体情况实际上是从本地文件加载本地文件,可以通过检查安全性首选项来激活...但是我无法分辨这个首选项是否实际检查或没有尝试。 – Okarin 2014-04-07 11:13:35

4

你可能想看看EasyXDM,它封装跨浏览器的怪癖,并提供一个易于使用的API使用最好的机制,该浏览器(如postMessage如果可用在不同的域之间的客户端脚本进行通信,其他机制,如果没有)。

很明显,该库已经解决了浏览器功能检测问题,所以您可以从他们的体验中受益。 :-)

1

IE8还有XDomainRequest可用于将RSS作为文本检索的对象,可以稍后将其解析为DOM。