首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >未关闭/未嵌套的HTML标记超出其父标记的范围

未关闭/未嵌套的HTML标记超出其父标记的范围
EN

Stack Overflow用户
提问于 2016-09-30 08:22:07
回答 1查看 950关注 0票数 18

当HTML标记没有关闭时,我遇到了一些有趣的功能。有时浏览器会插入额外的开始和结束标记来进行补偿,而有时只是插入一个结束标记。这可以通过示例得到最好的解释:

带有 <sup> 标签的:

first text node
<div> This is a parent div <sup>superscript tag starts IN parent</div> text OUTSIDE node of parent

带有 <s> 标签的:

first text node
<div> This is a parent div <s>strikethrough tag starts IN parent</div> text OUTSIDE node of parent

正如您在第一个示例中看到的,浏览器在其父标记关闭之前自动关闭<sup>标记。然而,在第二个示例中,浏览器似乎在其父标记的末尾之前关闭了<s>标记,然后在其父标记之后插入另一个以<s>开头的。

我已经看过了和规范-我似乎找不到任何关于浏览器如何解释和处理未关闭标签的特定内容。至少没有任何解释这个功能的东西。

我之所以想知道这一点,是因为我正在使用一个实时的markdown解析器--用户可能在解析源代码之前没有完成他们的标签。

我想知道浏览器是如何处理这些事情的,这样我就可以为那个用例编写代码了。目前,浏览器以不同的方式关闭不同的标签(正如你在我的例子中看到的)。

有人知道浏览器为什么要这么做吗?或者至少知道一个行为相同的元素列表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-30 10:57:21

多亏了@Ankith Amtange,我找到了发生什么的explanation。我将把它写在这里,以供将来的读者阅读。

因为它是一个格式化元素,所以<s>标记扩展到了它的父级之后。因为浏览器期望在父元素的末尾之前有一个结束的</sup>标记,所以<sup>标记会自动关闭。

HTML解析器以不同的方式处理堆栈中的元素,这些元素属于以下类别(source):

特殊要素

  • 以下元素具有不同级别的特殊解析规则:HTMLaddressappletareaarticleasidebase、D23、D24、D25、D26、D27、D28、D29、D30、D31、D32、D33、D34、D35、D36、<代码>D37、<代码>D38、<代码>D39、<代码>D40、<代码>D41、<代码>D42、<代码>D43/代码>、<代码>D44/代码>。frameframeseth1h2h3h4h5h6head、D54、D55、D56、D57、D58、D59、D60、D61、D62、D63、D64、D65、D66、D67、D68、D69、D70、D71、D72、D73、D74、D75、D76、D77scriptsectionselectsourcestylesummarytabletbodytd,D87,D88,D89,D90,D91,D92,D93,D94,D95,D96和D97;MathMLmimomnmsmtextannotation-xml;以及SVGforeignObject、<代码>D107和title.

格式元素

  • 以下HTML元素是那些最终出现在活动格式元素列表中的元素:abbigcodeemfont、D122、D123、D124、D125、D126、D127、D128和u.

普通元素

  • 分析HTML文档时找到的所有其他元素。

说明(来自链接规范):

最常被讨论的错误标记示例如下:

<p>1<b>2<i>3</b>4</i>5</p>

这个标记的解析非常简单,一直到"3“。此时,DOM看起来如下所示:

─html
 ├──head
 └──body
    └──p
       ├──"1"
       └──b
          ├──"2"
          └──i
             └──"3"

在这里,打开元素的堆栈有5个元素:htmlbodypbi。活动格式化元素列表只有两个:bi。插入模式为"in body“。

在接收到具有标签名称"b“的结束标签令牌时,调用”领养代理算法“。这是一个简单的例子,格式化元素是b元素,没有最远的块。因此,打开元素的堆栈最终只有三个元素:htmlbodyp,而活动格式化元素列表只有一个:iDOM树在这一点上没有修改。

下一个标记是一个字符("4"),它触发活动格式化元素的重构,在本例中仅是i元素。因此,为"4“文本节点创建了新的i元素。在还接收到"i“的结束标记令牌并插入"5”文本节点后,DOM如下所示:

─html
 ├──head
 └──body
    └──p
       ├──"1"
       ├──b
       │  ├──"2"
       │  └──i
       │     └──"3"
       ├──i
       │  └──"4"
       └──"5"
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39781886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档