我读HTML 4.01标准错了,还是Google?在HTML 4.01中,如果我写:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html> <head> <body>plain <em>+em <strong>+strong </em>-em
Google Chrome中的渲染为:
普通+ em + 强大 - em
这似乎与HTML 4.01标准相矛盾,该标准将基础SGML规则总结为:“结束标记关闭,返回匹配的开始标记,所有未关闭的插入开始标记都包含省略的结束标记”。¹ < / p>
也就是说,</em>
结束标记不仅应该关闭<em>
开始标记,还应该关闭未关闭的插入<strong>
开始标记,并且渲染应该是:
普通+ em + 强 -em
一位意见提供者指出,保持标签打开是不好的做法,但这只是一个学术范例。一个同样好的例子是:<em> +em <strong> +strong </em> -em </strong>
。根据HTML 4.01标准,我的理解是,由于重叠元素,此代码片段无法正常工作:</em>
结束标记应隐式关闭<strong>
。它确实按预期工作的事实令人惊讶,这就是我的问题所在。
事实证明我在这个问题中提出了一个错误的二分法:谷歌和我都没有读错HTML 4.01标准。 w3.org 的一位私人记者向我指出了Martin Bryan的 Web SGML和HTML 4.0 Explained ,他解释说“解析程序将自动关闭任何当前打开的程序嵌入元素,当遇到更高级别元素的结束标记时,已声明为具有可省略的结束标记。 (如果无法省略其结束标记的嵌入元素仍然打开,则程序将在编码中报告错误。)“²(强调添加。)Bryan的摘要SGML标准是正确的,HTML 4.01的摘要是错误的。
答案 0 :(得分:6)
允许省略某些标记(例如<p>
的结束标记或<body>
的开始和结束标记),而某些标记不是(例如{{1的结束标记) }})。前者是您引用的规范部分所指的。您可以通过use of a dash in the DTD:
<strong>
您所拥有的不是带有省略标记的HTML文档,而是浏览器将尝试执行错误恢复的无效伪HTML文档。
规范(适用于HTML 4)没有描述如何执行错误恢复,这是由浏览器完成的。
答案 1 :(得分:4)
HTML 4.01规范引用的声明非常模糊,或者在所有帐户中都是完全错误的。 HTML 4.01具有结束标记省略的特定规则,这些规则取决于元素。例如,可以省略p
元素的结束标记,永远不会省略em
的结束标记。规范中的语句可能尝试表示结束标记隐式关闭任何尚未关闭的内部元素,以允许结束标记省略。< / p>
没有浏览器实现定义的HTML 4.01(或任何早期的HTML规范),SGML功能正式成为其中的一部分。除非另有证明,否则HTML规范中关于SGML的任何内容都应理解为理论上的。
HTML5不会在这方面改变游戏规则,只会记下error handling rules。在像这样的简单问题中,规则只是使传统的浏览器行为成为常态。它们是面向标签的,将标签或多或少地视为格式化命令:<em>
表示“斜体”,</em>
表示“停止斜体”等。但HTML5也采取措施更正式地定义错误处理尽管有这样的标签汤使用,但是很明确地定义了DOM中的文档树。
答案 2 :(得分:1)
所有现代浏览器都使用HTML5解析器(即使是 HTML 4.01 内容),因此适用HTML5的解析规则。您可以在Parsing HTML Documents section in the HTML5 spec找到更多信息。
HTML大纲
答案 3 :(得分:1)
规范说:
Some HTML element types allow authors to omit end tags (e.g., the P and LI element types).
此:
Please consult the SGML standard for information about rules governing elements (e.g., they must be properly nested, an end tag closes, back to the matching start tag, all unclosed intervening start tags with omitted end tags (section 7.5.1), etc.).
适用于可省略结束标记的元素。
如果查看P元素规范,您会看到:
开始标记:必需,结束标记:可选
所以,当你使用它时:
<DIV>
<P>This is the paragraph.
</DIV>
P
元素将自动关闭。
但是,如果你查看EM规范,你会看到:
开始标记:必需,结束标记:必需
因此,自动关闭规则无效,因为HTML无效。
奇怪的是,所有浏览器都使用那种无效的HTML呈现相同的行为。
答案 4 :(得分:0)
如果您尝试通过http://validator.w3.org/check运行HTML,则会将此HTML标记为非常无效。
如果您的HTML无效,则所有投注均已关闭,不同的浏览器可能会以不同的方式呈现您的HTML。
答案 5 :(得分:0)
如果你看看D.O.M.通过右键单击并说明检查元素在Chrome中,您将能够推断出由于您的标记不匹配,它会应用算法来确定您搞砸了哪里。从技术上讲,它会在正确的位置关闭强标记。然而,它决定你可能试图使两段文本都变粗,所以它将最后一个-em放在一个全新的,额外的“强”元素中,同时保持'+ strong'在它自己的“强”元素中。在我看来,Chrome团队认为在统计上你可能希望两件事都是大胆的。