【问题标题】:Why does DOM children property behave differently for empty and non-empty HTML elements?为什么 DOM 子属性对于空和非空 HTML 元素的行为不同?
【发布时间】:2016-11-26 12:23:58
【问题描述】:

假设我有一个包含以下代码的 HTML 文件:

<foo>
    <bar id="bar1"></bar>
    <bar id="bar2"></bar>
    <bar id="bar3"></bar>
</foo>

<script>
    const foo = document.getElementsByTagName("foo")[0];
    const bars = foo.children;
    for (i = 0; i < bars.length; i++) {
        console.log(bars[0]);
    }
</script>

在浏览器(在我的例子中是 Chrome)中运行它会导致在控制台上打印三个 bar 节点,这是预期的行为。

但是,当我将 bar 节点的符号缩短如下

<foo>
    <bar id="bar1" />
    <bar id="bar2" />
    <bar id="bar3" />
</foo>

打印的节点数变成只有一个。似乎bar2bar1 的孩子,bar3bar2 的孩子。

HTML DOM 处理空元素的方式不同吗?

【问题讨论】:

  • 请使用有效的 HTML,不能保证当你给它垃圾时浏览器会如何表现。

标签: javascript html dom


【解决方案1】:

/&gt; 符号在 HTML 中没有任何意义。它只在 XML 中有意义。

就 HTML DOM 而言,在您的第二个示例中,您有三个 bar 元素(我可以添加无法识别),它们相互嵌套,缺少结束标签,使其等同于以下内容:

<foo>
    <bar id="bar1">
        <bar id="bar2">
            <bar id="bar3"></bar>
        </bar>
    </bar>
</foo>

换句话说,在第二个示例中实际上并没有空元素(#bar3 除外)——因为/&gt; 在 HTML 中没有意义,它不像在XML。

【讨论】:

  • 但是,我发现 W3Schools 另有说法w3schools.com/html/html_elements.asp。您可以在页面中搜索“空 HTML 元素”。
  • @Yuhuan Jiang:W3Schools 过于简单化了。它假定您正在使用 识别为 void 元素的标准元素。但是 /> 符号本身实际上没有任何意义;它仅在 HTML5 中允许,以方便从 XHTML 迁移的作者。由于“bar”不是真正的 HTML 元素,因此 HTML 处理器看到的只是一个缺少结束标记的 开始标记。
  • 你的意思是\&gt;不是一个通用的表示法,像&lt;br /&gt;这样有固定的一组元素吗?
  • @Yuhu环江:是的,在HTML中;另见Are void elements and empty elements the same?
猜你喜欢
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 2019-10-03
相关资源
最近更新 更多