一、前言
什么是doctype?其实我们一直使用,却很少停下来看清楚它到底是什么,对网页有什么作用。本篇将和大家一起探讨那个默默无闻的doctype吧!
二、什么是doctype
doctype或dtd就是声明在文档首行,位于<html>前,用于告知浏览器该文档遵循那种级别的html或xhtml规范。
其声明格式如下:
<!doctype① html②public③ "公共标识符"④"系统标识符"⑤ [<!element name (#pcdata)>]⑥>
①. dotype固定的起始部分
②. 声明文档以html标签为根标签
③. public用于表示第四部分是公共标识符
④. 公共标识符
⑤. 系统标识符
⑥. 内部子集,html不常见,一般出现在xml中
三、doctype的种类
doctype有三种类型(strict、transitional和frameset)。strict是最为严格的类型,要求文档内容做到
样式与数据完全分离,html标签中不允许使用任何表现层属性(如width等);transitional为非常宽松的dtd,允许你继续使用
html4.01的标签,并且数据和样式无需完全分离;frameset表文档会用到框架。
以xhtml为例:
strict
transitional
frameset
四、doctype的实际用途
那么不同的dtd会使浏览器切换到哪种状态,请参考下图:

注意:由于在现实使用过程中,发现doctype最大的作用就是用于文档模式的切换,于是html5规范将doctype的声明格式简化
为<!doctype html>,因此以后我们直接写这个简化版就好了。(“理论指导实践,实践验证真理”被再一次验证了)
五、documenttype类型
ie9+、ff、chrome和safari均支持documenttype类型,因此我们可以通过document.doctype获取documenttype类型的dtd对象。若文档没有声明dtd,则返回null。
5.1. 获取方式
除了通过document.doctype获取外,还可以通过document.childnodes[0]来获取。
5.2. 特点
不能动态cud,仅仅能通过该api获取dtd信息而已。
5.3. 属性值
nodetype:10
nodename:文档类型的名称(就是<!doctype 文档类型的名称>)
nodevalue:null
parentnode:htmldocument类型的元素对象(即是document)
parentelement:null
childnodes:空的nodelist
children:undefined
name:和nodename一样
entities:描述实体,恒返回null(ie9+有该属性,而chrome、ff直接删除该属性)
notations:描述符号,恒返回null(ie9+有该属性,而chrome、ff直接删除该属性)
5.4. dom2、dom3新增的属性
publicid:获取公共标识
systemid:获取系统标识
internalsubset:获取内部子集
5.5. ie5678下的dtd节点的解析
由于ie5678没有documenttype类型,因此document.doctype恒返回null。而通过document.childnodes[0]返回的是以注释类型来解析dtd。
六、总结
看了这么多,其实只需在以后开发的时候记得在文档首行加上<!doctype html>就ok了,简单了吧?