当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解析器--用户可能在解析源代码之前没有完成他们的标签。
我想知道浏览器是如何处理这些事情的,这样我就可以为那个用例编写代码了。目前,浏览器以不同的方式关闭不同的标签(正如你在我的例子中看到的)。
有人知道浏览器为什么要这么做吗?或者至少知道一个行为相同的元素列表?
发布于 2016-09-30 10:57:21
多亏了@Ankith Amtange,我找到了发生什么的explanation。我将把它写在这里,以供将来的读者阅读。
因为它是一个格式化元素,所以<s>
标记扩展到了它的父级之后。因为浏览器期望在父元素的末尾之前有一个结束的</sup>
标记,所以<sup>
标记会自动关闭。
HTML
解析器以不同的方式处理堆栈中的元素,这些元素属于以下类别(source):
特殊要素
HTML
的address
、applet
、area
、article
、aside
、base
、D23、D24、D25、D26、D27、D28、D29、D30、D31、D32、D33、D34、D35、D36、<代码>D37、<代码>D38、<代码>D39、<代码>D40、<代码>D41、<代码>D42、<代码>D43/代码>、<代码>D44/代码>。frame
、frameset
、h1
、h2
、h3
、h4
、h5
、h6
、head
、D54、D55、D56、D57、D58、D59、D60、D61、D62、D63、D64、D65、D66、D67、D68、D69、D70、D71、D72、D73、D74、D75、D76、D77script
,section
,select
,source
,style
,summary
,table
,tbody
,td
,D87,D88,D89,D90,D91,D92,D93,D94,D95,D96和D97;MathML
的mi
、mo
、mn
、ms
、mtext
和annotation-xml
;以及SVG
的foreignObject
、<代码>D107和title
.格式元素
HTML
元素是那些最终出现在活动格式元素列表中的元素:a
、b
、big
、code
、em
、font
、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个元素:html
、body
、p
、b
和i
。活动格式化元素列表只有两个:b
和i
。插入模式为"in body“。
在接收到具有标签名称"b
“的结束标签令牌时,调用”领养代理算法“。这是一个简单的例子,格式化元素是b
元素,没有最远的块。因此,打开元素的堆栈最终只有三个元素:html
、body
和p
,而活动格式化元素列表只有一个:i
。DOM
树在这一点上没有修改。
下一个标记是一个字符("4"),它触发活动格式化元素的重构,在本例中仅是i
元素。因此,为"4“文本节点创建了新的i
元素。在还接收到"i
“的结束标记令牌并插入"5”文本节点后,DOM
如下所示:
─html
├──head
└──body
└──p
├──"1"
├──b
│ ├──"2"
│ └──i
│ └──"3"
├──i
│ └──"4"
└──"5"
https://stackoverflow.com/questions/39781886
复制相似问题