浏览器会自动添加<a>-Tag without JavaScript</a>

时间:2013-11-02 01:04:22

标签: javascript html browser hyperlink inspector

我刚刚在比以下示例更大的网站上遇到问题,导致我调查几个小时,直到找到错误的原因。我的问题是,浏览器会自动生成<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是从服务器获取页面后唯一改变代码的东西。

嗯,现在我知道,这不是唯一的事情。在试图调试这个问题时,我没有在互联网上找到任何有关它的信息,所以我想我将与那个在将来遇到完全相同问题的人分享我的知识(我们都知道:他很快就会在那里)。

但是,还有一个悬而未决的问题:为什么?我看不出浏览器应该自动修复此内容并创建新标记的原因。这对我来说没有意义。

2 个答案:

答案 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)

两件事:

  1. <a/>可能被解释为尝试自动关闭锚标记,因此实际上是一个新锚点
  2. 嵌套锚是非法的,因此浏览器在打开第二个之前关闭第一个。
  3. 但是,我没有证明这一点,这几乎是一个猜测。


    更多推测:这可能是与浏览器相关的行为,与浏览器在表格中自动创建<tbody>标签的原因有关。他们刚才知道,如果没有<thead>,网站作者打算使用<tbody>

    因此,一旦自我关闭<a/>出现,它就会结束未封闭的锚并开始一个新的锚。虽然<a>意味着是一个容器,但它不能自我终止。然后锚点将根据XHTML规则结束,即在容器之前关闭包含的标签。

    这需要对HTML规范和各个浏览器行为进行大量查询。