html是萬維網上發布超文本的通用語言[1]。從1982年tim berners-lee簡化sgml建立html的原始定義到2001年發布xhtml1.1規范,html成為了有多個版本的國際標準[2]。各版本的規范都用一種機器可讀的語言定義,它描述了法定結構、元素和屬性,這就是文檔類型定義(document type definition),簡稱dtd。
相關文章:html代碼學習:doctype的縮寫
dtd描述了文檔類型聲明(dtd declaration,簡稱doctype[3])位于html文檔最前面,它是聯系文檔和dtd指令。比如html4.01 strict的doctype是:
<!doctype html public "-//w3c//dtd html 4.01//en" "http://www.w3.org/tr/html4/strict.dtd">
它指明了文檔使用的html版本,這是諸如瀏覽器之類的工具解析文檔時最需要的信息。比如w3c的驗證工具可依據它來檢查語法和指出錯誤。
早期瀏覽器對標準的錯誤實現、私有擴展的大量滋生和為了向前兼容以及早期標準本身的混亂等導致了那時的文檔既沒有doctype也沒有對dtd的直接引用,也導致了新的標準難以得到應用和普及,因為瀏覽器無法區分它們。為了處理根據web標準創作的網頁和根據陳舊實踐創作的網頁,todd fahrner 在1998年提出了“came up with a toggle”方法[4]能允許瀏覽器提供兩套渲染模式: 即有完整的doctype的文檔使用w3c的標準進行解析,否則使用舊的方式解析。
這個方法符合實際且簡單有效。兩年后,mac版ie上首次運用,很快的其他瀏覽器制造商紛紛采用, 這就誕生了doctype嗅探(doctype sniffing或doctype switching)。瀏覽器通過它來決定其引擎應該采用標準模式、準標準模式還是怪癖模式,這將對html和css的解析、css布局及javascript腳本產生非常大的影響[5] 。毫無疑問,我們應該盡可能的采用標準模式。
html5雖然還處于草案中,但最新瀏覽器firefox3.5、chrome2、safari4和ie8已經開始支持部分特性,特別是google wave的發布掀起了推進html5實踐的新高潮。html5并不基于sgml也沒有dtd,但它為了向前兼容,接受了doctype嗅探這個事實,定義了在text/html中doctype是唯一的模式轉換聲明,除此外沒有什么用處。其doctype如此簡潔:<!doctype html>[6] 。
值得一提的是ie8為了解決向前兼容采用了x-ua-compatible聲明[7],導致在ie8中瀏覽器的渲染模式不僅僅取決于doctype嗅探還取決于x-ua-compatible聲明,這個不僅僅導致了模式判斷更加復雜[8],也違背了web設計的逐漸增強(progressive enhancement)思想[9]。
在web標準的道路上,我們不僅需要充滿現實主義向前兼容,更需要充滿理想主義的向后兼容,這是保證我們的web能在未來正常工作的希望。在標準、簡單和逐漸增強的思想下,現在我們頁面的最佳方案或許是:
<!doctype html>…<meta http-equiv="x-ua-compatible" content="ie=edge">…
注釋:
新聞熱點
疑難解答