为什么此HTML标签甚至在装载body之前就具有body为最后一个孩子



我有一种感觉,这可能与对象参考有关,但这是:

我有以下代码:

<html>
    <head>
        <script type="text/javascript">
            console.log(document.getElementsByTagName("html"));
            console.log(document.getElementsByTagName("html")[0].lastChild);
       </script>
   </head>
   <body><h1>Hello</h1></body>
</html>

在控制台中,当我扩展第一个集合时,即使尚未解析身体元素,我也可以看到它具有身体为子节点(LastChild)。但是在第二个对象中,它显示了head标签,该标签是预期的。

现在,在这里发布此问题时,我创建了这支笔,但是在那儿,第二个控制台是身体标签,而不是头标签。

那么,为什么第一个控制台陈述在HTML中显示主体?还是必须使用浏览器做某事?谢谢

getElementsByTagName将为您提供 live htmlCollection。这意味着,当底层DOM发生变化时,函数返回的实时集合也会。

HTML DOM中的HTMLCollection是实时的;更改基础文档时会自动更新。

https://developer.mozilla.org/en-us/docs/web/api/htmlcollection

最初,在记录发生时,身体标签仍未解析。如果您可以在解析尸体之前检查控制台输出,则不会在那里看到它。

但是,当您实际上检查控制台中的HTMLCollection时,身体已经被解析,因此已显示(因为再次是HTMLCollection)。

如果要"打破"实时连接,则可以使用阵列扩展操作员将HTMLCollection投入到标准数组中:

const collection = [...liveCollection];

显然是第二个控制台。

fyi

其他常见的DOM查询功能(例如getElementsByClassName)也给您实时收藏。

如@scarySize所述,当您在第一个console.log上记录HTML标签时,它实际上会记录Live HTMLCollection。

最初,在记录发生时,身体标签仍未解析。因此,如果您可以在解析身体之前检查控制台输出,则不会在那里看到它。

但是,当您实际上可以检查控制台中的HTMLCollection时,身体已被解析,因此显示(因为再次,HTMLCollection是实时的)。

显然,第二个console.log打印了头标签,因为到了记录时,这确实是最后一个孩子。

最新更新