DOCTYPE, HTML和XHTML, Strict DTD和Transitional DTD, Quirks Mode和Standard Mode

在HTML里面声明DOCTYPE一般会有以下几种:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

是的,这里有HTML和XHTML,也有Transitional和Strict之分。顾名思义,XHTML是指这个文档是按照XML的格式来书写的,而HTML则表示这个文档是按照HTML的格式来书写的。Transition则表示这个文档达到了Transitional.dtd或者loose.dtd的要求,Strict则表示这个文档达到了strict.dtd的要求。但事实上我们经常会存在以下的误解: (1) 我的文档是声明为XHTML的,则我的文档肯定完全按照XML的格式。 (2) 我的文档是声明为Strict的,则我的文档肯定是按照Strict Mode的方式来Render的,反之,是以Quirks Mode的方式来Render的。

这两种理解都很直接,然而却是错误的,我们也经常会犯这种的错误。

首先,文档声明为XHTML和HTML,和文档的Parse(即浏览器对文档的分析)是没有直接关联的。事实上,浏览器如何Parse文档取决于服务器以什么格式来提供这个文档。通常情况下,有两种方式,"text/html"和"application/xhtml+xml"。只有以"application/html+xml"方式来提供的文档才能够被按照XML的方式来Parse。然而,因为浏览器的历史原因,并不是所有的浏览器都支持"application/xhtml+xml"格式的文档,IE7之前的版本(包括IE7)就不能够支持这种格式,如果IE7碰到这种格式的文档,它会提示用户另存为其它文件。考虑到IE使用的广泛性,目前绝大部分的文档都是以"text/html"的方式来提供的。以"text/html"方式来提供的文档是按照HTML的语义来Parse的,大家都知道HTML的容错性是非常强的,即使你的文档里面的TAG没有正确地关闭,这个HTML也能够被正确地显示出来。因此如果你的XHTML是以"text/html"的方式来提供的(绝大多数情况下都是),那么你即使在DOCTYPE里面声明了XHTML,你的文档也不是以XML的格式来Parse的,因此也不能保证你的文档是严格按照XML的规范的。事实上,很多专家都建议如果你的文档不是以"application/xhtml+xml"的方式来提供的,那么你就应该声明为HTML。

其次,浏览器以什么样的方式来Render你的文档,并不以你声明的DTD来决定的。事实上,如果你声明了DOCTYPE和DTD,你的文档就是以Strict Mode(或者称为Standard Mode,很多浏览器还包括Almost Standard Mode的方式,这里不进行区分)方式来Render的。对于没有DOCTYPE的文档,才是以Quirks Mode方式来Render的。因此浏览器的Render模式和你声明的DTD并没有直接的关系。

最后,你声明为Strict.dtd还是Transitional.dtd,在目前的浏览器看来是没有什么区别的。Strict.dtd比Transitional.dtd或者loose.dtd要严格多了,很多元素在strict.dtd里面都不能使用。然而因为浏览器的兼容性,即使你在DOCTYPE里面声明了Strict.dtd,浏览器遇到strict.dtd里面不允许的元素,也还能够正确地显示你的文档。我猜测浏览器并没有将DTD考虑进去。例如iframe这个TAG在strict.dtd里面并不存在,但即使你的DOCTYPE里面声明了strict.dtd,然后使用了iframe这个TAG,浏览器(包括IE7,IE8,FF3.0,Safari 3.0)都能够正确地显示你的文档。浏览器并没有按照你声明的DTD来Parse你的文档。目前能够保证你的文档是符合strict.dtd还是Transitional.dtd的,只能通过一些网上的Validator,如W3C Validator来分析,浏览器并不能够给你很好的支持。当然,实际上如果你能够严格按照你声明的DTD来书写你的文档,那是最好的,这样保证了以后浏览器对DTD严格遵守的时候,你的文档不会产生错误。

因此,

(1) 如果你的文档是以"text/html"的方式来提供的,那么你就应该声明为HTML。假如你想要让IE7能够正确地显示,那么你就更应该这么做了。 (2) 如果你的文档声明为XHTML,那么你应该以"application/html+xml"的方式来提供。 (3) 尽量在你的文档前面声明DOCTYPE和DTD,这样能够保证你不是以Quirks Mode的方式来Render文档的。 (4) 如果你声明了DTD,那么就要严格按照DTD的要求来书写你的文档。特别是如果你声明了Strict.dtd,那么你应该注意哪些元素是不能够使用的。

注意:本文发布于2008.5.20。随着时间的发展,浏览器对HTML和XHTML,Strict.dtd和Transitional.dtd的支持会更好。如果你的浏览器比IE7, IE8, FF 3.0和Safari 3.0要高很多很多的版本,那么你要注意本文的适用性。

时间: 2024-10-28 05:45:43

DOCTYPE, HTML和XHTML, Strict DTD和Transitional DTD, Quirks Mode和Standard Mode的相关文章

【代码笔记】XML深入学习:DTD约束与DTD语法(1)

2015-12-27 文件名    student.xml 1 <?xml version="1.0" encoding="GB2312" standalone="no"?> 2 <!--大家好,我是注释--> 3 <!--2015.12.27--> 4 <!DOCTYPE students SYSTEM "student.dtd"> 5 <!--这里没写盘符,及表示当前目

XML之外部DTD和内部DTD

DTD(Document Type Definition):文档类型定义,可以定义合法的XML文档结构,它使用一系列合法元素来定义文档的结构.DTD分为内部DTD和外部DTD,所谓内部DTD是指该DTD在某个文档的内部,只被该文档使用.外部DTD是指该DTD不在文档内部,可以被其他所有的文档来共享. 符号 含义 + >=1 * >=0 ? =0 或=1 数据的分类: 1.PCDATA(parse character data):可以解析的字符数据: 2.CDATA(character data

【代码笔记】XML深入学习:DTD约束与DTD语法(2)

DTD语法之定义实体(了解即可) 实体分为一般实体和参数实体. 定义实体:定义变量 引用实体:使用变量 一般实体:定义实体在DTD中,实体引用在xml中. 参数实体:定义实体在DTD中,实体引用在DTD中(内部DTD不可行). 定义一般实体: <!ENTITY 实体名 “实体值”>引用一般实体: 举例:  <!ENTITY  大美女 “李冰”> <student 学号=”ID_1001” 姓名=”王五” friend=”ID_1002” school=”&itcast

HTML之DocType的几种类型 -转载

HTML之DocType的几种类型转载 doctype类型详细doctype的几种类型html之doctype 分类: 前端文摘  在默认情况下,FF和IE的解释标准是不一样的,也就是说,如果一个网页没有声明DOCTYPE,它就会以默认的DOCTYPE解释下面的HTML.在同一种标准下,不同浏览器的解释模型都有所差异,如果声明标准不同,不用我说,您自己想就可以了.学习网页标准,浏览器兼容,从哪里开始您自己决定,但是,请认识DOCTYPE: 一.什么是DOCTYPE DOCTYPE是Documen

&lt;!DOCTYPE&gt; 的理解

[[ from <!DOCTYPE> 标签的深入理解 ]] 前言: 今天被问道“有没有仔细了解过<!DOCTYPE>标签?”,愣了一下,因为一开始在W3cschool上看到过建议使用XHTML Transitional DTD,之后就很听话地把Dreamweaver的HTML文档类型默认设置为XHTML 1.0 Transitional.之后就理所当然地一直用到现在了.人这东西还真是,越长大就越懒了,很多东西都被潜意识地当成了理所当然.既然已经被问及,就去找了找资料,总结了一下,权

[转载]html中DTD使用小结

原文链接:http://www.jb51.net/web/36856.html DTD 是一套关于标记符的语法规则.它是XML1.0版规格得一部分,是html文件的验证机制,属于html文件组成的一部分. DTD:三种文档类型:S(Strict).T(Transitional).F(Frameset). Strict:如果您需要干净的标记,免于表现层的混乱,请使用此类型.请与层叠样式表(CSS)配合使用 Transitional:DTD 可包含 W3C 所期望移入样式表的呈现属性和元素.如果您的

DTD与模式

摘要 我们在制作页面时必须要测的就是IE浏览器,毕竟IE浏览器市场占有率还是很高.随着HTML5的流行,可能项目要求兼容IE最低版本为IE8或者更高,但是还是有很多项目兼容IE低版本.所以我们经常会碰到页面在ie浏览器低版本中排版错乱的问题,这是因为IE浏览器有两个模式影响着页面,现在就来研究下 文档验证机制(DTD) DTD是html文件的验证机制,属于html文件组成的一部分.三种文档类型:S(Strict).T(Transitional).F(Frameset). Strict干净的标记,

&lt;!DOCTYPE&gt;标签的定义与用法

<!DOCTYPE> 声明位于文档中的最前面的位置,处于 <html> 标签之前,此标签可告知浏览器文档使用哪种 HTML 或 XHTML 规范. 该标签可声明三种 DTD 类型,分别表示严格版本.过渡版本以及基于框架的 HTML 文档. 以下面这个 <!DOCTYPE> 标签为例: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/

[转]&lt;!DOCTYPE&gt;标签的定义与用法

<!DOCTYPE>的定义: <!DOCTYPE>声明位于文档中的最前面的位置,处于<html>标签之前.此标签可告知浏览器文档使用哪种HTML或XHTML规范. 该标签可声明三种DTD类型,分别表示严格版本.过渡版本以及基于框架的HTML版本.(假如文档中的标记不遵循doctype声明所指定的DTD,这个文档除了不能通过代码校验之外,还有可能无法在浏览器中正确显示.) <!DOCTYPE>的用法: <!DOCTYPE html PUBLIC &quo