解释XMLHttpRequest创建

时间:2012-04-21 01:53:57

标签: xmlhttprequest

我正在从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");
 }

3 个答案:

答案 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。希望这会有所帮助。