内容。
- 术语
- 语言和序列化
- 规格
- 浏览器解析器和内容 (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/xml 或application/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 兼容文件的声明。