我正在从w3schools学习XMLHttpRequest。我不明白以下代码片段。 window.XMLHttpRequest
表示什么?是真是假?整个if / else结构是否仅用于考虑ie6和ie5,如果是这样,它们都可以被一行读取xmlhttp = new XMLHttpRequest()
吗?
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {
// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
答案 0 :(得分:4)
是的,我同意harschware,有一些跨浏览器工具有帮助,因为它是一个复杂的领域。
以上代码是一个跨浏览器的代码段,用于创建XMLHTTPRequest
对象。
结构良好,因为它依赖于功能检查而不是浏览器检查。请参阅此文章“功能检测而不是浏览器检测”: http://www.javascripttoolbox.com/bestpractices/
所以这个:
if (window.XMLHttpRequest)
- 检测浏览器是否具有作为全局函数(window对象的成员)实现的XMLHttpRequest功能,如果是,则以这种方式构造XMLHttpRequest对象。
否则代码盲目假定它可以通过调用ActiveXObject函数来创建XMLHttpRequest,这是在IE5和IE6中创建这样一个对象的方法。
最后一个假设可能不正确,因为浏览器可能甚至没有该功能,或者它可能以不同的方式实现。可以在最后一个案例中提出例外。
答案 1 :(得分:2)
摘要
...
中的
if (window.XMLHttpRequest) { ... }
仅在支持standard-XHR时进行评估。另外,ActiveX用于支持IE5-6。
要检查是否支持XMLHttpRequest
API specification ,请测试全局XMLHttpRequest
对象是否存在。由于window
是全局对象,因此只需检查window.XMLHttpRequest
属性是否存在。 {1}
如下图所示,!
是逻辑NOT 运算符,用于在if (window.XMLHttpRequest)
中显示结果。
if (window.XMLHttpRequest)
// Supported:
!!window.XMLHttpRequest === !![object XMLHttpRequest] === !false === true
// Not supported, so the property does not exist, and is undefined
!!window.XMLHttpRequest === !!undefined === !true === false
但是,这不是故事的结局。 XHR的概念源自微软,它是第一个通过ActiveXObject
:Internet Explorer 5.0在浏览器中实现它的人。稍后,在7.0版中,Microsoft添加了对标准化XHR API的支持。
没有人关心IE5了。但是,仍然有相当数量的IE6用户(约1%)。因此,通过以下方式支持IE5-6并没有什么坏处。
... } else { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
<小时/> {1}:要考虑的其他方法:
if (typeof window.XMLHttpRequest !== 'undefined')
- 这也可以。if (XMLHttpRequest)
- 不应使用。当变量不存在(=未声明)时,抛出ReferenceError:
XMLHttpRequest未定义`答案 2 :(得分:1)
The story of XMLHTTP分享了一些关于XMLHTTP和XMLHttpRequest的有趣历史。简而言之,XMLHTTP由Microsoft作为ActiveX对象引入,您需要使用new ActiveXObject("Microsoft.XMLHTTP")
或new ActiveXObject("MSXML2.XMLHTTP.6.0")
创建它,有关详情,请参阅Using the right version of MSXML in Internet Explorer。后来其他浏览器供应商发现这个组件很有用,并与W3C合作,以XMLHttpRequest的名义对其进行标准化,XMLHttpRequest是window对象的本机对象,可以使用new XMLHttpRequest()
进行实例化。但是,并非所有浏览器都支持XMLHttpRequest对象,例如IE6和IE5,通常的做法是通过if (window.XMLHttpRequest)
检测XMLHttpRequest对象是否是窗口对象的有效对象 - 如果是,则用new创建它,否则尝试回退到XMLHTTP ActiveX。希望这会有所帮助。