当前位置: 首页 > 知识库问答 >
问题:

为什么document.all虚假?

汤飞羽
2023-03-14

<代码>文档。all是DOM中的一个非原始对象,它是falsy。

例如,此代码不做任何事情:

if (document.all) {
    alert("hello");
}

有人能解释一下这是为什么吗?

共有3个答案

卫建义
2023-03-14

现代浏览器不再实现这种过时的东西。它是由IE引入的,但大多数其他浏览器都将其“垫片”以兼容。

为了使浏览器检测成为可能(回到过去,你可以通过测试文档来区分IE和NN。所有的都是)同时支持文档。所有的语法,其他浏览器都实现了“奇怪”的文档类型。all返回未定义。

Opera> document.all
// prints the array-like object
Opera> typeof document.all
"undefined"
Opera> Boolean(document.all)
false

在FF放弃对它的支持之前,它还表现出了这条消息中所述的奇怪行为。你可以在Mozilla bug#412247中找到更多内部信息。

W3C邮件列表存档中还有一个很长的线程,从http://lists.w3.org/Archives/Public/public-html/2009Jun/0546.html

空佐
2023-03-14

现在有一个对象的[[IsHTMLDDA]]内部插槽:

实现定义的对象上可能存在[[IsHTMLDDA]]内部插槽。具有[[IsHTMLDDA]]内部插槽的对象在ToBoolean和Abstract Equality比较抽象运算中的行为类似于未定义的,并且当用作typeof运算符的操作数时。

HTML标准也已更新,为实现HTMLAllCollection接口的对象添加了内部插槽:

实现HTMLAllCollection接口的对象是具有以下部分中描述的附加[[调用]]内部方法的传统平台对象。它们还有一个[[IsHTMLDDA]]内部插槽。

这种疯狂的原因在HTML标准的注释中有详细说明:

这些特殊行为的动机是希望与两类遗留内容兼容:一类使用document.all的存在作为检测遗留用户代理的方法,另一类仅支持这些遗留用户代理并使用document.all对象而不首先测试其存在。

因此,基本上,标准希望与这两种类型的代码兼容:

>

  • 检查它是否在Internet Explorer中运行以使用其非标准功能的代码,例如document.all和Activex;

    js prettyprint-override">if (document.all) {
        useActiveXStuff();
    }
    

    假定它在Internet Explorer中运行并使用document.all的代码。

    document.all["my-button"].onclick = function () {
        alert("hi");
    };
    

  • 孟昆
    2023-03-14

    免责声明:我就是那个在推特上发布这个问题的人:)这是一个我会在我的正面演讲中提出并回答的问题。我在上台前5分钟写下了这条推特。

    我问的问题如下。

    ECMAScript规范定义如下:

    如您所见,根据规范,所有非基本对象(即所有非布尔、数字、字符串、未定义的对象或空对象)都是真实的。然而,在DOM中,有一个例外-是虚假的DOM对象。你知道那是哪一个吗?

    答案是文档。全部。HTML规范说:

    属性必须返回以文档节点为根的HTMLAllCollection,其过滤器匹配所有元素。

    为all返回的对象有几个不寻常的行为:

    用户代理必须充当JavaScript中的ToBoolean()运算符将all返回的对象转换为false值。

    出于和的目的,用户代理必须像这样工作=

    用户代理的行为必须确保当应用于为所有返回的对象时,JavaScript中的typeof运算符返回字符串“未定义”。

    这些要求是对编写本文时当前的JavaScript规范(ECMAScript第5版)的故意违反。JavaScript规范要求ToBoolean()运算符将所有对象转换为true值,并且没有为某些运算符的目的规定对象的行为就好像它们是未定义的。这种违规行为的动机是希望与两类遗留内容兼容:一类使用document.all的存在作为检测遗留用户代理的方法,另一类仅支持这些遗留用户代理并使用document.all对象而不首先测试其存在。

    因此,document.all是这个ECMAScript规则的唯一官方例外。(在Opera中,document.attachEvent等也是错误的,但这并没有在任何地方规范。)

    上面的文字解释了为什么这样做。但这里有一个在旧网页上非常常见的示例代码片段,它将进一步说明这一点:

    if (document.all) {
      // code that uses `document.all`, for ancient browsers
    } else if (document.getElementById) {
      // code that uses `document.getElementById`, for “modern” browsers
    }
    

    基本上,在很长一段时间内。所有都以这种方式用于检测旧浏览器。因为<代码>文档。不过,所有的都是首先测试的,提供这两个属性的更现代的浏览器仍然会出现在文档中。所有代码路径。在现代浏览器中,我们更喜欢使用文档。当然,getElementById,但由于大多数浏览器仍然有文档。所有(出于其他向后兼容性原因)如果文档,则永远不会访问其他。一切都是真实的。如果代码的编写方式不同,这不会是一个问题:

    if (document.getElementById) {
      // code that uses `document.getElementById`, for “modern” browsers
    } else if (document.all) {
      // code that uses `document.all`, for ancient browsers
    }
    

    但可悲的是,许多现有代码的做法正好相反。

    解决这个问题的最简单方法是简单地制作文档。在仍然模仿它的浏览器中,所有这些都是虚假的。

     类似资料:
    • 我是一个Flex/Actionscript难民,试图用JS/HTML5/CSS3实现我的目标。有些事情可以立竿见影,但还有一些事情却没有立竿见影。 我正在看这个JSFIDLE“纯Javascript可拖动”,我不理解这一行(或者更确切地说,我理解它在做什么,但不理解它是如何做的) 我查了一下“document.all”,它似乎是元素的缩写。queryselectoral()没有参数? 返回从调用它

    • 问题内容: 当你应该使用与? 问题答案: 是W3C标准的专有Microsoft扩展。 是标准的-使用它。 但是,请考虑使用像jQuery这样的js库是否会派上用场。例如,相当于的jQuery 。另外,您不仅可以使用CSS3选择器。

    • 当我们遇到一类频繁询问关键点信息的题目时,往往数据范围颇大,而对关键点总和有一定限制,此时我们可以建立虚树,将问题规模转化为关键点总和级别的。 一、定义 什么是虚树? 当我们在树上有部分结点是无用的或用处不大的时,我们可以将其在树上删去,仅仅保留关键点和连接关键点的边。 如图,图中红点是关键点,右图即为建立的虚树。 二、性质 1. 空间线性性质 虚树的点数是O(n)的,因为其仅仅包含n个关键点和它

    • 问题内容: 导入标准“日志记录”模块会对一堆虚拟条目造成sys.modules污染: 因此,导入此软件包会将额外的名称放入sys.modules中,除了它们不是模块以外,仅引用None。其他模块(例如xml.dom和编码)也有此问题。为什么? 编辑: 在bobince的答案的基础上,有一些页面描述了功能的起源(请参阅“ sys.modules中的虚拟条目”部分)和功能的未来。 问题答案: 中的值是

    • 简单地说,虚拟机(Virtual Machine)就是允许我们在当前操作系统中运行其他操作系统的软件,本质上和 VS、QQ 这些应用程序一样。 所以,只要我们在电脑(PC 或笔记本等)上安装好虚拟机软件,就可以模拟出来若干台相互独立的虚拟 PC 设备,每一个都如何一台真实的计算机。在此基础上,我们可以给每台虚拟的 PC 设备安装指定的操作系统,这样就可以实现在一台电脑上同时运行多个操作系统。 另外

    • 本文向大家介绍什么是虚拟DOM?相关面试题,主要包含被问及什么是虚拟DOM?时的应答技巧和注意事项,需要的朋友参考一下 虚拟 dom 是相对于浏览器所渲染出来的真实 dom 的,在react,vue等技术出现之前,我们要改变页面展示的内容只能通过遍历查询 dom 树的方式找到需要修改的 dom 然后修改样式行为或者结构,来达到更新 ui 的目的。 这种方式相当消耗计算资源,因为每次查询 dom 几