5

我读错了 HTML 4.01 标准,还是谷歌?在 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

谷歌浏览器中的渲染是:

普通 + em +- em

这似乎与 HTML 4.01 标准相矛盾,该标准将基本的 SGML 规则总结为:“结束标记关闭,回到匹配的开始标记,所有未闭合的中间开始标记都省略了结束标记”。¹

也就是说,</em>结束标签不仅应该关闭<em>开始标签,还应该关闭未关闭的中间<strong>开始标签,并且呈现应该是:

普通 + em +-em

一位评论者指出,打开标签是不好的做法,但这只是一个学术例子。一个同样好的例子是:<em> +em <strong> +strong </em> -em </strong>. 我从 HTML 4.01 标准中了解到,由于元素重叠,此代码片段无法按预期工作:</em>结束标记应隐式关闭<strong>. 它确实按预期工作的事实令人惊讶,这就是我提出问题的原因。

事实证明,我在问题中提出了错误的二分法:Google 和我都没有读错 HTML 4.01 标准。w3.org的一位私人通讯员向我介绍了 Martin Bryan解释的 Web SGML 和 HTML 4.0 ,其中解释说:“[t] 解析程序将自动关闭任何当前打开的嵌入元素,这些元素已被声明为具有可忽略的结束标签遇到更高级别元素的结束标记。(但是,如果一个不能省略结束标签的嵌入元素仍然是打开的,那么程序会在编码中报错.)”<a href="http://www.is-thought.co.uk/book/sgml-9.htm#Omitting" rel="nofollow">² (已添加重点。)Bryan 对 SGML 标准的总结是对的,而 HTML 4.01 的总结是错误的。

4

6 回答 6

5

有些标签是允许省略的(如结束标签<p>或开始和结束标签<body>),有些则不允许(如结束标签<strong>)。您引用的规范部分指的是前者。您可以通过在 DTD 中使用破折号来识别它们:

<!ELEMENT P - O (%inline;)*            -- paragraph -->
  ^A p element
            ^ requires a start tag
              ^ has optional end tag
                 ^ contains zero or more inline things
                                       ^ Comment: Is a paragraph

您所拥有的不是带有省略标记的 HTML 文档,而是浏览器将尝试对其执行错误恢复的无效伪 HTML 文档。

该规范(针对 HTML 4)没有描述如何执行错误恢复,这取决于浏览器。

于 2012-01-06T23:58:14.167 回答
5

从 HTML 4.01 规范中引用的声明非常模糊,或者在所有方面都是完全错误的。HTML 4.01 对结束标记省略有特定的规则,这些规则取决于元素。例如,一个p元素的结束标签可能会被省略,而一个元素的结束标签em可能永远不会被省略。规范中的声明可能试图说结束标记隐式地关闭任何尚未关闭的内部元素,以允许省略结束标记

没有浏览器实现过定义的 HTML 4.01(或任何更早的 HTML 规范),SGML 特性是它的正式组成部分。HTML 规范中关于 SGML 的任何内容都应被视为只是理论上的,除非另有证明。

HTML5在这方面并没有改变游戏规则,只是它写下了错误处理规则。在像这样的简单问题中,规则只是让传统的浏览器行为成为一种规范。它们是面向标签的,或多或少将某些<em>标签视为格式化命令:表示“斜体”,</em>表示“停止斜体”等。但 HTML5 也采取措施更正式地定义错误处理,因此尽管使用了这样的标签汤,但它是明确定义将在 DOM 中构造什么文档树。

于 2012-01-07T00:16:28.467 回答
1

所有现代浏览器都使用 HTML5 解析器(即使对于HTML 4.01内容),因此适用 HTML5 的解析规则。您可以在 HTML5 规范中的Parsing HTML Documents部分找到更多信息。

HTML 大纲

  • HTML
      • #文本“”()
    • 身体
      • #text “普通”()
      • 电磁场
        • #text "+em" (斜体)
        • 强的
          • #text "+strong" (粗体/斜体)
      • 强的
        • #text “-em”(粗体)
于 2012-01-06T23:54:04.397 回答
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 表现出相同的行为。

于 2012-01-07T00:15:54.947 回答
-1

如果您通过右键单击并说检查元素来查看 Chrome 中的 DOM,您将能够推断出,由于您的标签不匹配,它会应用一种算法来确定您在哪里搞砸了。从技术上讲,它确实在正确的位置关闭了强标签。但是,它确定您可能试图将两段文本都加粗,因此它将最后一个 -em 放在一个全新的、额外的“强”元素中,同时将“+强”保留在它自己的“强”元素中。在我看来,chrome 团队认为在统计上你可能希望这两个东西都加粗。

于 2012-01-07T00:15:33.377 回答
-1

如果您尝试通过http://validator.w3.org/check运行您的 HTML ,它将将该 HTML 标记为几乎无效。

如果您的 HTML 无效,那么所有的赌注都将被取消,并且不同的浏览器可能会以不同的方式呈现您的 HTML。

于 2012-01-07T00:01:56.957 回答