我有一种感觉,这可能与对象参考有关,但这是:
我有以下代码:
<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
打印了头标签,因为到了记录时,这确实是最后一个孩子。