未关闭被错误的HTML标签延伸超过其父级

未关闭被错误的HTML标签延伸超过其父级,第1张

概述当HTML标签未关闭时,我遇到了一些有趣的功能。有时,浏览器会插入额外的打开和关闭标签以进行补偿,其他时候只会插入一个结束标签。这最好通过例子来解释: 使用< sup>标签: first text node<div> This is a parent div <sup>superscript tag starts IN parent</div> text OUTSIDE node of pare 当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>在父母之后。

我浏览了<s><sup>规范 – 我似乎找不到任何具体的浏览器如何解释和处理未封闭的标签。至少没有什么可以解释这个功能。

我想知道这一点的原因是我正在使用的实时标记解析器 – 用户可能在解析源之前不能完成标签。

我想知道浏览器如何处理这些事情,所以我可以为这个用例编写代码。目前,浏览器以不同的方式处理不同的标签(如我的示例所示)。

有谁知道浏览器为什么这样做?或者至少知道一个行为一致的元素列表?

解决方法 感谢@Ankith Amtange我发现了 explanation发生了什么。我会在这里写下来给未来的读者。

< s>标签由于是一个格式化元素而延伸超过其父项。 < sup>标签会自动关闭,因为浏览器期待关闭< / sup>标签在父元素结束之前。

HTML解析器在其堆栈中对待元素不同,它们分为以下类别(source):

Special elements

The following elements have varying levels of special parsing rules: HTML‘s address,applet,area,article,asIDe,base,baseFont,bgsound,blockquote,body,br,button,caption,center,col,colgroup,dd,details,dir,div,dl,dt,embed,fIEldset,figcaption,figure,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,HTML,iframe,img,input,isindex,li,link,Listing,main,marquee,Meta,nav,noembed,noframes,noscript,object,ol,p,param,plaintext,pre,script,section,select,source,style,summary,table,tbody,td,template,textarea,tfoot,th,thead,Title,tr,track,ul,wbr,and xmp; MathML‘s mi,mo,mn,ms,mtext,and annotation-xml; and SVG‘s foreignObject,desc,and Title.

Formatting elements

The following HTML elements are those that end up in the List of active formatting elements: a,b,big,code,em,Font,i,nobr,s,small,strike,strong,tt,and u.

Ordinary elements

All other elements found while parsing an HTML document.

说明(来自链接规范):

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

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

这个标记的解析直到“3”。在这一点上,DOM看起来像这样:

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

这里,开放元素的堆栈有五个元素:HTML,body,p,b和i。活动格式元素的列表只有两个:b和i。插入模式是“体内”。

在收到标签名称为“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"
总结

以上是内存溢出为你收集整理的未关闭/被错误的HTML标签延伸超过其父级全部内容,希望文章能够帮你解决未关闭/被错误的HTML标签延伸超过其父级所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1111806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存