2 回答
实际的问题应该是,您为什么要故意向浏览器提供无效的 HTML?
但回到主题。从历史上看,HTML 一直是一种生涩的标记语言。没有 DOM 概念的人会编写 HTML,例如:
<B><U>hi, </B> shall I be underlined or not?</U>
以上显然是无效的 HTML。但是,如果您使用无效的 HTML 输入浏览器,浏览器不会呕吐。它将尝试以作者认为的方式恢复文档。
DOM 中的元素(这是检查器向您显示的)只能有一个父元素。所以从逻辑上讲,<U>
必须在关闭之前<B>
关闭。但是<U>
作者没有关闭,所以浏览器认为其余的文本也应该加下划线。因此,无效的 HTML 被恢复为大致如下的 DOM 结构:
<B><U>hi, </U></B><U> shall I be underlined or not?</U>
在您的特定情况下,<a>
标签不能在 HTML 中自行关闭,因此:
<a>...<a/>
被/
解释为语法糖,浏览器认为您打开了第二个<a>
元素而没有关闭第一个元素。它很可能会在整个文档中生成锚元素,直到</a>
在恢复过程中遇到必要的关闭。
两件事情:
<a/>
可能会被解释为自闭锚标签的尝试,所以实际上是一个新的锚- 嵌套锚是非法的,因此浏览器会在打开第二个之前关闭第一个。
但是,我没有证据证明这一点,这几乎是一个猜测。
更多猜测:这可能是一种依赖于浏览器的行为,并且与浏览器自动<tbody>
在表格中创建标签的原因有关。他们只是已经知道,如果没有<thead>
,网站作者打算使用<tbody>
.
所以一旦自闭<a/>
出现,就结束了未闭的锚,开始了新的锚。虽然因为<a>
它是一个容器,但它不能自我终止。然后锚将根据 XHTML 规则结束,即在容器之前关闭包含的标签。
这将需要对 HTML 规范和个别浏览器行为进行大量查询。