【问题标题】:HTML 4, HTML 5, XHTML, MIME types - the definitive resourceHTML 4、HTML 5、XHTML、MIME 类型 - 权威资源
【发布时间】:2011-02-09 09:19:59
【问题描述】:

HTML vs. XHTML 和 XHTML as text/html vs. XHTML as XHTML 的主题相当复杂。不幸的是,很难得到一个完整的画面,因为信息主要是在网络上以零碎的形式传播,或者深埋在 W3C 技术术语中。此外,还有一些错误信息正在传播。我建议将此作为有关该主题的权威 SO 资源,描述以下最重要的方面:

  • HTML 4
  • HTML 5
  • XHTML 1.0 作为文本/html、应用程序/xml+xhtml
  • XHTML 1.1 作为应用程序/xml+xhtml

每种方法的实际意义是什么?
常见的陷阱有哪些?
每种类型的正确 MIME 类型的重要性是什么?
不同的浏览器是如何处理的?

我希望每种技术都有一个答案。我正在将其设为社区 wiki,因此请编辑答案以完成图片,而不是提供多余的答案。随意从存根开始。也可以随意编辑这个问题。

【问题讨论】:

  • 太多问题合二为一
  • @scunliffe 这就是重点。将这些信息按原样分发只会造成混乱。恕我直言,每种技术需要两到三个段落,在一页上分布在 4 或 5 个答案中。
  • 总是使用 text/xml+html ... 让 IE 用户无法访问... :)
  • “恕我直言,每种技术需要两个或三个段落,在一页上分布在 4 或 5 个答案中”——那么 Stack Overflow 不适合它。它是为问答而设计的,而不是针对主题的权威指南。
  • @Paul 我不敢苟同。 One of the goals of the website is to be a continually evolving source of good information. Community Wiki posts help enhance the wiki aspect of the site.meta.stackexchange.com/questions/11740/…

标签: xhtml html mime-types


【解决方案1】:

内容。

  • 术语
  • 语言和序列化
  • 规格
  • 浏览器解析器和内容 (MIME) 类型
  • 浏览器支持
  • 验证器和文档类型定义
  • Quirks、Limited Quirks 和标准模式。

术语

描述这一点的困难之一显然是,自 HTML 首次引入以来,官方规范中的术语多年来发生了变化。以下内容基于 HTML5 术语。此外,“文件”用作通用术语,表示文件、文档、输入流、八位字节流等,以避免必须做出细微区分。

语言和序列化

HTML 和 XHTML 是根据语言和序列化定义的。

语言定义了元素和属性的词汇,以及它们的内容模型,即哪些元素被允许在哪些其他元素中,哪些属性被允许在哪个元素上,以及每个元素和属性的目的和含义。

序列化定义了如何使用标记来描述文本文档中的这些元素和属性。这包括需要哪些标签,可以推断哪些标签,以及这些推断的规则。它描述了应如何标记无效元素(例如“>”与“/>”)以及何时需要引用属性值等内容。

规格

HTML 4.01 规范是定义 HTML 语言和 HTML 序列化的当前规范。

XML 1.0 规范定义了一个序列化,但让语言由其他规范定义,称为“XML 应用程序”

XHTML 1.0 和 1.1 规范都在使用中。本质上,它们使用与 HTML 4.01 相同的语言,但使用不同的序列化,一种与 XML 1.0 规范兼容的序列化。即 XHTML 是一个 XML 应用程序。

HTML5(截至 2010 年 4 月 18 日,草稿)规范描述了一种适用于 HTML 和 XHTML 的新语言。这种语言主要是 HTML 4.01 语言的超集,但旨在仅向后兼容现有的 Web 工具(例如浏览器、搜索引擎和创作工具),而不是与出现差异的先前规范。因此,某些元素的含义偶尔会从早期的规范中改变。同样,每个序列化都向后兼容当前工具。

浏览器解析器和内容 (MIME) 类型

当一个文本文件被发送到浏览器时,它被解析成它的内部内存结构(对象模型)。为此,它使用遵循 HTML 序列化规则或 XML 序列化规则的解析器。它使用哪种解析器取决于它根据“content-type”HTTP 标头上的非本地文件推断出的内容类型。在内部,一旦文件被解析,浏览器就会以几乎相同的方式处理对象模型,无论它最初是使用 HTML 还是 XHTML 序列化提供的。

对于使用其 XHTML 解析器的浏览器,内容类型 HTTP 标头必须是 XML 内容类型之一。最常见的是application/xmlapplication/xhtml+xml。任何非 XML 内容类型都意味着该文件,无论是否符合所有 XHTML 语言和序列化规则,都不会被浏览器作为 XHTML 处理。

使用 text/html 的 HTTP 内容类型(或在大多数回退方案中,缺少内容类型或任何其他非 XML 类型)将导致浏览器使用其 HTML 序列化解析器。

两个解析器之间的一个关键区别是 HTML 序列化解析器执行错误恢复。如果解析器的输入文件不符合 HTML 序列化规则,解析器将以逆向工程的方式从以前的浏览器中恢复并继续构建其对象模型,直到到达文件末尾。 HTML5 包含了恢复的第一个规范定义,但截至 2010 年 4 月 26 日的发布版本中,没有主流浏览器提供该算法的实现。

相比之下,XML 序列化解析器将在遇到无法解释为 XML 的任何内容时停止(即,当它发现文件不是 XML 格式正确时)。这是 XML 1.0 规范对解析器的要求。

浏览器支持

大多数现代浏览器都支持 HTML 解析器和 XML 解析器。但是,在 Microsoft Internet Explorer 8.0 和更早版本中,XML 解析器无法直接创建对象模型以呈现为 HTML 页面。但是,可以使用 XSLT 文件处理 XML 结构以创建流,然后使用 HTML 解析器对其进行解析以创建可以呈现的对象模型。

从 Internet Explorer 9 Platform Preview 开始,使用 XML 内容类型提供的 XHTML 可以像其他现代浏览器一样被直接解析。

当他们的 XML 解析器检测到他们的输入文件不是格式正确的 XML 时,一些浏览器会显示错误消息,而另一些浏览器会显示在检测到错误时所构建的页面,而另一些浏览器会为用户提供机会使用他们的 HTML 解析器重新解析文件。

验证器和文档类型定义

HTML 和 XHTML 文件可以以文档类型定义 (DTD) 声明开始,该声明指示文档中使用的语言和序列化。验证器(例如http://validator.w3.org/ 的验证器)使用此信息将文件中使用的语言和序列化与 DTD 中定义的规则进行匹配。然后它根据文件中的标记违反 DTD 中的规则的位置报告错误。

并非所有 HTML 序列化和语言规则都可以在 DTD 中描述,因此验证器仅测试规范描述的所有规则的子集。

HTML 4.01 和 XHTML 1.0 定义了 Strict、Transitional 和 Frameset DTD,它们在兼容文件中允许的语言元素和属性方面有所不同。

基于 HTML5 的验证器(例如 validator.nu)的行为更像浏览器,根据 HTTP 内容类型处理页面并使用非基于 DTD 的规则集,以便捕获 DTD 无法描述的错误。

Quirks、Limited Quirks 和标准模式。

浏览器不会验证发送给它们的文件。他们也不使用任何 DTD 声明来确定文件的语言或序列化。但是,他们确实使用它来猜测页面创建的时代,从而猜测作者当时对浏览器的预期解析和呈现行为。因此,他们定义了三种解析和渲染模式,称为 Quirks 模式、Limited Quirks(或几乎标准)模式和标准模式。

使用 XML 内容类型提供的任何文件始终以标准模式处理。对于使用 HTML 解析器解析的文件,如果没有提供 DTD 或 DTD 被确定为非常旧,则浏览器会使用其 quirks 模式。广义上讲,作为 text/html 处理的 HTML 4.01 和 XHTML 文件如果包含过渡 DTD,则将以有限的怪癖模式处理,如果使用严格的 DTD,则以标准模式处理。

当 DTD 未被识别时,模式由一组复杂的规则决定。一种特殊情况是省略了公共标识符和系统标识符,而声明只是 。这是已知的最短 doctype 声明,当前浏览器会将文件视为标准模式。因此,它是指定用于 HTML5 兼容文件的声明。

【讨论】:

  • +1 很好的答案。我特别喜欢“语言”和“序列化”的解释。
【解决方案2】:

XHTML

质量检查

XHTML 有成熟的 QA 工具,但 DTD 更松散(例如,<textarea rows="" 在 HTML 4.01 和 XHTML 1.0 中是一个一致性错误,但在 HTML 4.01* 中只是一个有效性错误)。尽管 XHTML 1.0 从理论上讲,HTML 4.01 是用 XML 表示的。有许多不同之处,规范的“Differences with HTML 4”部分中没有记录。

使用 MIME 类型 application/xhtml+xml(见下文)提供的 XHTML 文档需要 100% 符合 XML 标准,即它需要是“格式良好的 XML”。即使是单个未转义的 & 符号也可能导致解析器(浏览器)抛出警告并拒绝呈现文档。在创建可能包含第三方提供的内容(例如任何用户输入)的动态 XHTML 站点时,需要非常小心地转义任何和所有无效字符序列,不允许无效标签或属性并正确嵌套所有元素。

浏览器支持

  • XHTML 作为 text/html 得到了很好的支持,但你必须跳过compatibility 箍。如果不跳过这些环节,一个完全有效的页面可能无法呈现(例如,<script type="text/javascript" src="foo" /> 导致文档的其余部分被视为脚本而不是 HTML)或显示其他问题。
  • XHTML 作为 application/xhtml+xml 得到了大多数浏览器的相当好的支持(可能存在一些小错误)。它在 Internet Explorer

MIME 类型 application/xhtml+xml vs text/html

用作 text/html 的 XHTML 既不是 XHTML 也不是 HTML。它被浏览器像 HTML 一样处理,但由于它不是 HTML,所以它被视为标签汤。由于 Internet Explorer 不知道如何使用 application/xhtml+xml 处理 XHTML,因此它只需要作为 IE 的 text/html 提供。这意味着 IE 的 XHTML 始终是标签汤,除非 HTML 和 XHTML 之间的差异也趋于一致(请参阅Differences with HTML 4)。

欢迎来到痛苦的世界。您会遇到下游代理问题(您必须根据执行条件的任何请求标头来改变缓存)。文档结构发生变化(例如,没有<tbody> 标签的表格可能有也可能没有<tbody> 元素,具体取决于内容类型)。从本质上讲,制作两个几乎相同的文档需要大量工作。

XHTML 和 Javascript

当使用适当的 application/xhtml+xml MIME 类型解析 XHTML 文档时,通过 Javascript 操作 DOM 元素时可能会有所不同。一些未正确准备的脚本可能会在 XHTML 环境中以不同的方式工作或失败。
示例:在 HTML 下,像 console.log(document.body.tagName); 这样的 JavaScript 命令会输出“BODY”,而在 XHTML 下同样的命令会输出“body”。
如果您在标记中有<table><tr>..</tr></table,则表格在JavaScript 中的firstChild 将是XHTML 中的tr,但在HTML 中是TBODY

使用 XHTML 的优点(如 application/xhtml+xml)

  • 允许直接交织其他 XML 格式,例如 MathML 和 SVG。
  • 理论上解析速度更快。但在实践中差异可以忽略不计。

* 段落需要一些润色。

【讨论】:

    【解决方案3】:

    HTML

    质量检查

    • HTML5 仍有相当不成熟的 QA 工具
    • HTML 4 已经存在了很长时间,并且拥有非常成熟的 QA 工具

    浏览器支持

    • HTML 5 — 各种浏览器都支持点点滴滴。您需要 Javascript 来支持大多数事情,如果 Javascript 不可用,基本结构元素(如<section>)会非常糟糕。 *
    • HTML 4 得到很好的支持

    * 需要一些说明和示例。

    【讨论】:

    • 我已将 XHTML 部分分支为一个单独的答案,因此该答案可以专注于 HTML 并进行扩展。
    【解决方案4】:

    严格与过渡与框架集

    为什么?

    HTML 和 XHTML 有不同的风格,即 StrictTransitionalFrameset。每个“方言”都指定了一组不同的允许使用的元素。

    使用Strict 跳入深渊会限制您的一些开箱即用的选项(例如not being able to specify target attributes),这对许多人来说是不可行的。

    主要区别

    请展开

    【讨论】:

      【解决方案5】:

      其实没那么复杂,也真的没那么重要。

      • HTML 和 XHTML 仅在语法上有所不同。
      • 您不能将 XHTML 作为 XML 提供给 Internet Explorer,并且这样做不会在其他浏览器中获得任何好处。

      你还需要知道什么?

      【讨论】:

      • 这不是建设性的答案,尽量保持协作,不要假装你知道所有的答案,这个社区就是不这样工作的。
      猜你喜欢
      • 2011-05-11
      • 2012-02-27
      • 2012-05-30
      • 1970-01-01
      • 2017-03-04
      • 2014-10-16
      • 2011-07-18
      • 2011-12-24
      • 2012-05-20
      相关资源
      最近更新 更多