为什么<a id="test"> breaks out of the DOM chain?</a>

时间:2012-03-12 15:39:24

标签: javascript html html5 dom

<!DOCTYPE html>
<html>
    <head>
        <title>Test</title>
    </head>
    <script type="text/javascript">
        function fire() {
            console.log(document.body.children.length);
            console.log(document.body.children[0].children.length);
        }
    </script>
    <body onload="fire()">
        <div>
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer pharetra ipsum erat. Aenean convallis laoreet massa, et gravida purus faucibus ac. <a id="test"/>Vestibulum libero justo.</p>
        </div>
    </body>
</html>

当您打开控制台时,您会看到<a>children <body><div><p>。 WTF?

如果使用“正确的”结束标记关闭<a>,问题就会消失,并且唯一的子项为<p>

有人可以向我解释一下吗?

PS:在Chrome稳定版上测试过。

5 个答案:

答案 0 :(得分:8)

我想这是因为a不是有效的短标签。

答案 1 :(得分:3)

根据W3C推荐:

  

12.2 A元素[...]开始标记:必需,结束标记:必需

无效HTML。您需要至少在<a id="test"></a>之后直接关闭代码。

来源:http://www.w3.org/TR/html401/struct/links.html

答案 2 :(得分:1)

<a> tags需要结束标记(</a>)。

<a />无效,浏览器会尝试弄清楚你的意思,但不要指望一致行为。

答案 3 :(得分:1)

w3schools.com/tags/default.asp您可以看到自我结束标记:

"area", "base", "basefont", "br", "col", "frame", "hr", "img", "input", "link", "meta", "param"

A标记不应自动关闭。

答案 4 :(得分:1)

这是html5,而不是xml。只允许void elements具有此类表示。 另见8.1.2.1第6部分