一、前言
什麼是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了,簡單了吧?