如何确定是使用XMLHttpRequest还是XDomainRequest?

5

根据不同的浏览器,我需要确定应该使用哪个对象。对于IE < 10,应该使用 XDomainRequest,其余浏览器应该使用 XMLHttpRequest

if(window.XDomainRequest) //basically 'if IE'
    //XDomainRequest
else
    //XMLHttpRequest

自从IE10有Cross-Origin Resource Sharing支持,最好使用XMLHttpRequest对象。这段代码将不再有效(我认为IE10仍然支持XDomainRequest,如果我错了,请纠正我,我无法测试)。直接检查浏览器并不是确定事情的最安全方式。那么我的问题是,确定应该使用哪个对象的最佳方法是什么?我正在寻找纯JS(非jQuery)解决方案。


尝试使用XMLHttpRequest,如果出现错误,例如在try/catch中使用XdomainRequest。不过有一个问题,您是否会向其他域发送请求? - apelsinapa
是的,这就是为什么我不能使用你的想法 - IE<10也有XMLHttpRequest对象,但它不能用于请求外部域。 - geehertush01
2
这对你有帮助吗?https://dev59.com/c3I-5IYBdhLWcg3w3cc8 - apelsinapa
是的,可能就是这样,非常感谢!我说“可能”,因为我无法测试new XMLHttpRequest()中的 'withCredentials' 在IE10中是否为 true,但应该是这样的。虽然这可能是一个有点“不稳定”的解决方案 - “Chrome 2在这个测试中失败了[尽管它支持跨域请求]”。 - geehertush01
如果我是你,我不会再使用Chrome 2了,因为今天的版本是25。我已经测试过:在IE10中,('withCredentials' in new XMLHttpRequest())的结果为true。 - apelsinapa
1个回答

5

这是我的做法,但不够好。

var useXDR = window.XDomainRequest && (window.XMLHttpRequest && new XMLHttpRequest().responseType === undefined);

这是因为IE10在新创建XHR时,responseType的值为空字符串,但在不支持XHR2的IE版本中,它的值是未定义的。

如果您选择使用XDR,请记住,XDR比XHR更难调试 - 当某些问题出现时,它提供的信息更少,并且一些在旧的XmlHttpRequest实现上能够很好地工作的功能在XDR上根本无法工作。

即使您的浏览器不支持XHR2但支持XDR,当您请求与页面加载的主机/端口相同的URL时,仍应使用XHR。


1
这个答案应该被接受。为什么之前至少没有被点赞? - Derek Henderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接