HTML是萬維網上發布超文本的通用語言[1]。從1982年Tim Berners-Lee簡化SGML建立HTML的原始定義到2001年發布XHTML1.1規範,HTML成為了有多個版本的國際標準[2]。各版本的規範都用一種機器可讀的語言定義,它描述了法定結構、元素和屬性,這就是文檔類型定義(Document Type Definition),簡稱DTD。
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"> …
註:
[1] HTML is the lingua franca for publishing hypertext on the World
Wide Web
[2] http://zh.wikipedia.org/wiki/Html
[3] DTD declaration在先前規範中也常叫Document Type Declaration,
很容易和DTD混淆。
[4] http://web.archive.org/web/20030212115103/http://www.geocrawler.
com/archives/list-name.mbox/123/1998/7/0/1037920/
[5]用doctype啟動瀏覽器模式
[6] http://www.w3.org/TR/html5/syntax.html#the-doctype
[7]超越文件類型,web標準化向前相容和IE8
[8] http://dancewithnet.com/2009/06/14/activating-browser-modes
-with-doctype/#ie8modes
[9] Web標準前途是否依賴瀏覽器技術
原文:http: //ued.koubei.com/? p=928