在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要高很多很多的版本,那么你要注意本文的适用性。

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

  1. HTML5/HTML 4.01/XHTML 元素和有效的 DTD

    HTML5/HTML 4.01/XHTML 元素和有效的 DTD 下面的表格列出了所有的 HTML5/HTML 4.01/XHTML 元素,以及它们会出现在什么文档类型 (DTD) 中: 标签 HTM ...

  2. XML之外部DTD和内部DTD

    DTD(Document Type Definition):文档类型定义,可以定义合法的XML文档结构,它使用一系列合法元素来定义文档的结构.DTD分为内部DTD和外部DTD,所谓内部DTD是指该DT ...

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

    2015-12-27 文件名    student.xml <?xml version="1.0" encoding="GB2312" standalon ...

  4. J2EE进阶(十九)FileNotFoundException: http://hibernate.org/dtd/hibernate-mapping-3.0.dtd

    J2EE进阶(十九)Nested exception: java.io.FileNotFoundException: http://hibernate.org/dtd/hibernate-mappin ...

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

    DTD语法之定义实体(了解即可) 实体分为一般实体和参数实体. 定义实体:定义变量 引用实体:使用变量 一般实体:定义实体在DTD中,实体引用在xml中. 参数实体:定义实体在DTD中,实体引用在DT ...

  6. HTML之DocType的几种类型 -转载

    HTML之DocType的几种类型转载 doctype类型详细doctype的几种类型html之doctype 分类: 前端文摘  在默认情况下,FF和IE的解释标准是不一样的,也就是说,如果一个网页 ...

  7. <!DOCTYPE>

     定义和用法 所有浏览器都支持 <!DOCTYPE> 声明. <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. <!D ...

  8. [转载]html中DTD使用小结

    原文链接:http://www.jb51.net/web/36856.html DTD 是一套关于标记符的语法规则.它是XML1.0版规格得一部分,是html文件的验证机制,属于html文件组成的一部 ...

  9. jsp中<!DOCTYPE>标签

    今天写代码时遇到一个问题,定义了如下一个样式: .c_c1:hover td { background-color: #edf5ce;} <tr class="c_c1"&g ...

随机推荐

  1. color 颜色代码 android res/values/colors.xml

    <?xml version="1.0" encoding="utf-8"?> <resources> <color name=&q ...

  2. 汇编语言-打印部分ASCII表

    用表格形式显示字符 1. 题目:用表格形式显示ASCII字符 2.要求:按15行×16列的表格形式显示ASCII码为10H-100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显示对应的字 ...

  3. Excel导入功能

    一:前端 <t:dgToolBar title="Excel题库导入" icon="icon-search" onclick="question ...

  4. netty启动过程

    netty先启动work线程,work线程打开selector 绑定pipeline 启动boss线程,绑定端口,注册selector,绑定op_accetp事件 ------------------ ...

  5. js-shortid:优雅简洁地实现短ID

    短ID在实际运用中很广泛, 其中比较典型的运用就是短地址. 市面上肯定有不少开源的生成短ID库, 基于node.js的估计也不少. 鉴于本人已然是node.js的脑残粉(本职java开发), 很多业余 ...

  6. Redis源码研究--字符串

    之前看的内容,占个位子,以后补上. ------------8月2日------------- 好久没看了,惭愧,今天抽了点时间重新看了Redis的字符串,一边写博客,一边看. Redis的字符串主要 ...

  7. 添加打印机的时候怎样说windows没法连接到打印机毛病为0x00000002

    把PrinterExtensionsandNotifications这个服务启动1下试试 PrintSpooler服务停止然后再启用试试

  8. vector 内部方法大全 学习(初学者的参考资料)

    1    vector构造函数:也就是如何对一个vector对象进行初始化 ////////////////////////////代码//////////////////////////////// ...

  9. s3c-u-boot-1.1.6源码分析

    源码 源码结构 移植准备

  10. 四、记一次失败的 CAS 搭建 之 结果总是那么伤(客户端)

    ==================================================================================================== ...