dec*_*eze 29 html xhtml html5 mime-types
HTML与XHTML和XHTML作为text/html与XHTML作为XHTML的主题非常复杂.不幸的是,很难得到一个完整的图片,因为信息主要是在网络上的点点滴滴传播,或深埋在W3C技术术语中.此外还有一些错误信息正在传播.我建议将此作为关于该主题的权威SO资源,描述最重要的方面:
每个人的实际意义是什么?
常见的陷阱是什么?
适当的MIME类型对每个类型的重要性是什么?
不同的浏览器如何处理它们?
我希望每项技术都能找到一个答案.我正在制作一个社区维基,所以请编辑答案以完成图片,而不是提供多余的答案.随意从存根开始.也可以随意编辑这个问题.
Alo*_*hci 38
描述这一点的困难之一很明显,自从HTML首次引入以来,官方规范中的术语多年来发生了变化.以下内容基于HTML5术语.此外,"文件"用作通用术语,表示文件,文档,输入流,八位字节流等,以避免必须进行细微区分.
HTML和XHTML是根据语言和序列化定义的.
该语言定义了元素和属性的词汇表,以及它们的内容模型,即哪些元素被允许在哪个元素内,哪些属性被允许在哪个元素上,以及每个元素和属性的目的和含义.
序列化定义了如何使用标记来描述文本文档中的这些元素和属性.这包括需要哪些标签,哪些可以推断,以及这些推论的规则.它描述了如何标记空元素(例如">"vs"/>")以及何时需要引用属性值.
HTML 4.01规范是定义HTML语言和HTML序列化的当前规范.
XML 1.0规范定义了序列化,但使语言由其他规范定义,这些规范被称为"XML应用程序"
XHTML 1.0和1.1规范都在使用中.本质上,它们使用与HTML 4.01相同的语言,但使用不同的序列化,一个与XML 1.0规范兼容的序列化.即XHTML是一个XML应用程序.
HTML5(截至2010-04-18,草案)规范描述了HTML和XHTML的新语言.这种语言主要是HTML 4.01语言的超集,但只是向后兼容现有的Web工具(例如浏览器,搜索引擎和创作工具),而不是以前出现差异的规范.因此,某些元素的含义偶尔会从早期的规范中改变.同样,每个序列化都与当前工具向后兼容.
将文本文件发送到浏览器时,会将其解析为其内部存储器结构(对象模型).为此,它使用遵循HTML序列化规则或XML序列化规则的解析器.它使用哪种解析器取决于它根据"内容类型"HTTP标头上的非本地文件推断出的内容类型.在内部,一旦解析了文件,浏览器就会以几乎相同的方式处理对象模型,无论它最初是使用HTML还是XHTML序列化提供的.
对于浏览器使用其XHTML解析器,内容类型HTTP标头必须是XML内容类型之一.最常见的是,这是application/xml
或者application/xhtml+xml
.任何非XML内容类型都意味着该文件无论是否符合所有XHTML语言和序列化规则,都不会被浏览器作为XHTML处理.
使用HTTP内容类型text/html
(或在大多数回退场景中,缺少内容类型或任何其他非XML类型)将导致浏览器使用其HTML序列化解析器.
两个解析器之间的一个关键区别是HTML序列化解析器执行错误恢复.如果解析器的输入文件不符合HTML序列化规则,则解析器将以从先前浏览器反向设计的方式恢复,并继续构建其对象模型,直到它到达文件末尾.HTML5包含恢复的第一个规范定义,但是截至2010-04-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无法描述的错误.
浏览器不会验证发送给它们的文件.它们也不使用任何DTD声明来确定文件的语言或序列化.但是,他们确实使用它来猜测页面创建的时代,因此可能是作者当时对浏览器的期望解析和呈现行为.因此,它们定义了三种解析和渲染模式,称为Quirks模式,Limited Quirks(或Almost Standards)模式和Standards模式.
使用XML内容类型提供的任何文件始终以标准模式处理.对于使用HTML解析器解析的文件,如果没有提供DTD或确定DTD非常旧,则浏览器使用其怪癖模式.从广义上讲,处理为text/html的HTML 4.01和XHTML文件如果包含过渡DTD则使用有限的怪癖模式处理,如果使用严格的DTD则使用标准模式.
在无法识别DTD的情况下,模式由一组复杂的规则确定.一个特例是省略了公共和系统标识符,声明只是<!DOCTYPE html>.这被称为最短的doctype声明,当前浏览器将该文件视为标准模式.因此,它是指定用于HTML5兼容文件的声明.