10

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

3 回答 3

4

是的,我同意 harschware,拥有一些跨浏览器工具会有所帮助,因为它是一个复杂的领域。

XMLHTTPRequest上面的代码是一个创建对象的跨浏览器代码片段。

它结构良好,因为它依赖于功能检查而不是浏览器检查。请参阅本文“功能检测而不是浏览器检测”: http ://www.javascripttoolbox.com/bestpractices/

所以这:

if (window.XMLHttpRequest)

-- 检测浏览器是否具有作为全局函数(窗口对象的成员)实现的 XMLHttpRequest 功能,如果是,则 XMLHttpRequest 对象是以这种方式构造的。

否则,代码会盲目地假设它可以通过调用 ActiveXObject 函数来创建 XMLHttpRequest,如前所述,这是在 IE5 和 IE6 中创建此类对象的方法。

最后一个假设可能不正确,因为浏览器甚至可能没有该功能,或者它可能以不同的方式实现。最后一种情况可能会引发异常。

于 2012-04-21T15:59:09.650 回答
2

概括

...if (window.XMLHttpRequest) { ... }仅在支持标准 XHR 时才评估in 。否则,ActiveX 用于支持 IE5-6。

要检查是否支持XMLHttpRequestAPI规范,请测试全局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 is undefined`
于 2012-04-22T07:59:47.173 回答
1

XMLHTTP 的故事分享了一些关于 XMLHTTP 和 XMLHttpRequest 的有趣历史。长话短说,Microsoft 将 XMLHTTP 作为 ActiveX 对象引入,您需要使用new ActiveXObject("Microsoft.XMLHTTP")或创建它,有关更多信息new ActiveXObject("MSXML2.XMLHTTP.6.0"),请参阅在 Internet Explorer 中使用正确版本的 MSXML。后来其他浏览器厂商发现这个组件很有用,并与 W3C 合作,以 XMLHttpRequest 的名义对其进行标准化,XMLHttpRequest 是 window 对象的原生对象,可以用new XMLHttpRequest(). 然而,由于并非所有浏览器都支持 XMLHttpRequest 对象,例如 IE6 和 IE5,一种常见的做法是检测 XMLHttpRequest 对象是否是 window 对象的有效对象,if (window.XMLHttpRequest)如果是,则使用 new 创建它,否则尝试回退到 XMLHTTP ActiveX。希望这可以帮助。

于 2012-04-21T15:50:46.597 回答