我刚刚在比以下示例更大的网站上遇到问题,导致我调查几个小时,直到找到错误的原因。我的问题是,浏览器会自动生成<a>
- 无用的标签。
假设我有一些看起来像这样的HTML代码:
<a href="#">Link<a/>
<!-- Some code-magic; after a while you have something like: -->
<div>Not a link</div>
当然,在这种情况下问题非常明显。但是如果页面有点复杂并且您没有注意到上面<a>
- 标记的错误结束,那么您将度过一段美好时光。
为什么呢?嗯,这很容易显示。您可能希望随后的所有内容都是可点击的。事实确实如此。但是 - 这是我不知道的事情 - 浏览器在页面加载后添加<a>
- 标签。这意味着,在检查员(在Chrome和Firefox中测试)中,你会发现这样的东西:
<a href="#">Link</a>
<a>
<!-- Some code-magic; after a while you have something like: -->
<div>Not a link</div>
</a>
有意思,对吧?浏览器在第一行正确关闭<a>
- 标记,并在div周围打开一个新标记。你可能会猜到我已经开始调试页面上的所有JavaScripts(有很多),因为我认为JavaScript是从服务器获取页面后唯一改变代码的东西。
嗯,现在我知道,这不是唯一的事情。在试图调试这个问题时,我没有在互联网上找到任何有关它的信息,所以我想我将与那个在将来遇到完全相同问题的人分享我的知识(我们都知道:他很快就会在那里)。
但是,还有一个悬而未决的问题:为什么?我看不出浏览器应该自动修复此内容并创建新标记的原因。这对我来说没有意义。
答案 0 :(得分:4)
实际问题应该是,为什么你会故意用无效的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>
。
答案 1 :(得分:2)
两件事:
<a/>
可能被解释为尝试自动关闭锚标记,因此实际上是一个新锚点但是,我没有证明这一点,这几乎是一个猜测。
更多推测:这可能是与浏览器相关的行为,与浏览器在表格中自动创建<tbody>
标签的原因有关。他们刚才知道,如果没有<thead>
,网站作者打算使用<tbody>
。
因此,一旦自我关闭<a/>
出现,它就会结束未封闭的锚并开始一个新的锚。虽然<a>
意味着是一个容器,但它不能自我终止。然后锚点将根据XHTML规则结束,即在容器之前关闭包含的标签。
这需要对HTML规范和各个浏览器行为进行大量查询。