Doctype之谜

原文地址: http://ued.koubei.com/?p=928

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标准前途是否依赖浏览器技术 
 

XeonWell Studio