提问人: 提问时间:4/18/2010 最后编辑:5 revs, 3 users 63%deceze 更新时间:5/23/2019 访问量:9134
HTML 4、HTML 5、XHTML、MIME 类型 - 权威资源
HTML 4, HTML 5, XHTML, MIME types - the definitive resource
问:
HTML vs. XHTML 和 XHTML 作为文本/html vs. XHTML XHTML 的主题非常复杂。不幸的是,很难获得一个完整的画面,因为信息大多在网络上传播,或者深埋在W3C技术术语中。此外,还有一些错误信息正在传播。我建议将其作为有关该主题的权威 SO 资源,描述以下最重要的方面:
- [HTML格式] 4
- [HTML格式] 5
- XHTML 1.0 作为 text/html、application/xml+xhtml
- XHTML 1.1 作为 application/xml+xhtml
每种方法的实际意义是什么?
常见的陷阱是什么?
正确的 MIME 类型对每种类型的重要性是什么?
不同的浏览器如何处理它们?
我希望看到每种技术的一个答案。我正在使它成为一个社区维基,所以与其提供多余的答案,不如编辑答案以完成图片。随意从存根开始。也可以随意编辑这个问题。
答:
XHTML格式
质量保证
XHTML 具有成熟的 QA 工具,但 DTD 比较松散(例如 是 HTML 4.01 和 XHTML 1.0 中的一致性错误,但只是 HTML 4.01 中的有效性错误)。尽管 XHTML 1.0 在理论上是以 XML 表示的 HTML 4.01。有许多差异,这些差异未记录在规范的“与 HTML 4 的差异”部分。<textarea rows=""
*
当 XHTML 文档与 MIME 类型的 application/xhtml+xml(见下文)一起提供时,需要 100% 符合 XML 标准,即它需要是“格式正确的 XML”。即使是单个未转义的 & 符号也可能导致解析器(浏览器)抛出警告并拒绝呈现文档。在创建可能包含第三方提供的内容(例如任何用户输入)的动态 XHTML 站点时,需要非常小心地转义任何和所有无效的字符序列,不允许无效的标签或属性,并正确嵌套所有元素。
浏览器支持
- XHTML 作为 text/html 得到了很好的支持,但您必须跳过兼容性问题。如果不跳过这些箍,一个完全有效的页面可能无法呈现(例如 导致文档的其余部分被视为脚本而不是 HTML)或显示其他问题。
<script type="text/javascript" src="foo" />
- 大多数浏览器都相当支持 application/xhtml+xml 作为 application/xhtml+xml 的 XHTML(可能存在一些小错误)。它在 Internet Explorer <= 8 中根本不起作用。
MIME 类型 application/xhtml+xml 与 text/html
用作文本/html 的 XHTML 既不是 XHTML 也不是 HTML。它被浏览器处理得像 HTML,但由于它不是 HTML,所以它被视为标签汤。由于 Internet Explorer 不知道如何使用 application/xhtml+xml 处理 XHTML,因此它只需要作为 IE 的文本/html 提供。这意味着 XHTML for IE 始终是标签汤,除非 HTML 和 XHTML 之间的差异也趋于此(请参阅与 HTML 4 的差异)。
欢迎来到一个痛苦的世界。您会遇到下游代理问题(您必须根据执行条件的任何请求标头来改变缓存)。文档结构会发生变化(例如,没有标签的表格可能有也可能没有元素,具体取决于内容类型)。基本上,制作两个几乎相同的文件是一项艰巨的工作。<tbody>
<tbody>
XHTML 和 Javascript
当使用正确的 application/xhtml+xml MIME 类型解析 XHTML 文档时,通过 Javascript 操作 DOM 元素时可能会有所不同。某些未正确准备的脚本在 XHTML 环境中可能会以不同的方式工作或失败。
示例:在 HTML 下,JavaScript 命令将输出“BODY”,而 XHTML 下的相同命令将输出“body”。
如果你有标记,JavaScript中的表格将是XHTML中的,但HTML中的表格。console.log(document.body.tagName);
<table><tr>..</tr></table
firstChild
tr
TBODY
使用 XHTML 的优点(作为 application/xhtml+xml)
- 允许其他 XML 格式(如 MathML 和 SVG)的直接交错。
- 从理论上讲,解析速度更快。不过,在实践中,这种差异可以忽略不计。
*
段落需要一些润色。
[HTML全
质量保证
- HTML5 仍然有相当不成熟的 QA 工具
- HTML 4 已经存在了很长时间,并且拥有非常成熟的 QA 工具
浏览器支持
- HTML 5 — 各种浏览器都支持位和片段。你需要 Javascript 来支持大多数东西,如果 Javascript 不可用,基本的结构元素(比如)会非常糟糕。
<section>
*
- HTML 4 得到了很好的支持
*
需要一些澄清和例子。
评论
严格 vs. 过渡 vs. 框架集
为什么?
HTML 和 XHTML 有不同的风格,即 和 。每个“方言”指定了一组允许使用的不同元素。Strict
Transitional
Frameset
跳入深渊会限制您的一些开箱即用的选项(例如,无法指定目标
属性),这对许多人来说是不可行的。Strict
主要区别
请展开
内容。
- 术语
- 语言和序列化
- 规格
- 浏览器分析器和内容 (MIME) 类型
- 浏览器支持
- 验证程序和文档类型定义
- Quirks、Limited Quirks 和 Standards 模式。
术语
显然,描述这一点的困难之一是,自 HTML 首次引入以来,官方规范中的术语多年来一直在变化。以下内容基于 HTML5 术语。此外,“文件”用作通用术语,表示文件、文档、输入流、八位字节流等,以避免进行精细区分。
语言和序列化
HTML 和 XHTML 是根据语言和序列化来定义的。
该语言定义了元素和属性的词汇表及其内容模型,即哪些元素允许在哪些其他元素中,哪些属性允许在哪个元素上,以及每个元素和属性的用途和含义。
序列化定义如何使用标记来描述文本文档中的这些元素和属性。这包括哪些标签是必需的,哪些标签可以推断,以及这些推断的规则。它描述了诸如如何标记 void 元素(例如“>”与“/>”)以及何时需要引用属性值之类的内容。
规格
HTML 4.01 规范是定义 HTML 语言和 HTML 序列化的当前规范。
XML 1.0 规范定义了序列化,但将语言留给其他规范定义,这些规范称为“XML 应用程序”
XHTML 1.0 和 1.1 规范都在使用中。从本质上讲,它们使用与 HTML 4.01 相同的语言,但使用不同的序列化,即与 XML 1.0 规范兼容的序列化。i.e. XHTML 是一个 XML 应用程序。
HTML5(截至 2010-04-18,草案)规范描述了一种用于 HTML 和 XHTML 的新语言。这种语言主要是 HTML 4.01 语言的超集,但旨在仅向后兼容现有的 Web 工具(例如浏览器、搜索引擎和创作工具),而不是与以前的规范兼容,因为存在差异。因此,某些元素的含义偶尔会与之前的规范有所变化。同样,每个序列化都与当前工具向后兼容。
浏览器分析器和内容 (MIME) 类型
当文本文件被发送到浏览器时,它被解析到其内部内存结构(对象模型)中。为此,它使用遵循 HTML 序列化规则或 XML 序列化规则的解析器。它使用哪个分析器取决于它根据“content-type”HTTP 标头上的非本地文件推断的内容类型。在内部,一旦文件被解析,浏览器就会以几乎相同的方式处理对象模型,而不管它最初是使用 HTML 还是 XHTML 序列化提供的。
要使浏览器使用其 XHTML 分析器,内容类型 HTTP 标头必须是 XML 内容类型之一。最常见的是,这是 or 。任何非 XML 内容类型都意味着,无论文件是否满足所有 XHTML 语言和序列化规则,浏览器都不会将其作为 XHTML 进行处理。application/xml
application/xhtml+xml
使用 HTTP 内容类型(或在大多数回退方案中,缺少内容类型或任何其他非 XML 类型)将导致浏览器使用其 HTML 序列化分析器。text/html
这两个分析器之间的一个关键区别是 HTML 序列化分析器执行错误恢复。如果解析器的输入文件不符合 HTML 序列化规则,则解析器将以从以前的浏览器进行逆向工程的方式进行恢复,并继续构建其对象模型,直到到达文件末尾。HTML5 包含恢复的第一个规范性定义,但截至 2010 年 4 月 26 日,还没有主流浏览器发布在发布版本中启用的算法实现。
相反,XML 序列化分析器在遇到任何无法解释为 XML 的内容时(即,当它发现文件格式不正确时)将停止。这是 XML 1.0 规范对分析器的要求。
浏览器支持
大多数现代浏览器都支持 HTML 解析器和 XML 解析器。但是,在 Microsoft Internet Explorer 8.0 及更早版本中,XML 分析器无法直接创建对象模型以呈现为 HTML 页。但是,XML 结构可以使用 XSLT 文件进行处理以创建流,然后使用 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、Transition 和 Frameset DTD,它们在兼容文件中允许的语言元素和属性方面有所不同。
基于 HTML5 的验证器(如 validator.nu)的行为更像浏览器,根据 HTTP 内容类型处理页面,并使用非基于 DTD 的规则集,以便捕获 DTD 无法描述的错误。
Quirks、Limited Quirks 和 Standards 模式。
浏览器不会验证发送给他们的文件。它们也不使用任何 DTD 声明来确定文件的语言或序列化。但是,他们确实使用它来猜测页面创建的时代,从而猜测作者当时对浏览器的可能解析和呈现行为。因此,它们定义了三种解析和渲染模式,称为 Quirks 模式、Limited Quirks(或几乎标准)模式和 Standards 模式。
使用 XML 内容类型提供的任何文件始终在标准模式下进行处理。对于使用 HTML 解析器解析的文件,如果没有提供 DTD 或确定 DTD 非常旧,浏览器将使用其 quirks 模式。从广义上讲,如果 HTML 4.01 和 XHTML 文件包含过渡 DTD,则将使用受限怪癖模式进行处理,如果使用严格的 DTD,则使用标准模式进行处理。
如果无法识别 DTD,则模式由一组复杂的规则确定。一种特殊情况是省略了公共和系统标识符,而声明只是<!DOCTYPE html>。众所周知,这是最短的文档类型声明,当前浏览器会将文件视为标准模式。因此,它是指定用于 HTML5 兼容文件的声明。
评论
其实没那么复杂,也真的没什么大不了的。
- HTML 和 XHTML 仅在语法上有所不同。
- 您不能将 XHTML 作为 XML 提供给 Internet Explorer,并且这样做不会在其他浏览器中获得任何好处。
你还需要知道什么?
评论
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.