日期:2014-04-20  浏览次数:21614 次

你做了所有你认为正确的事情,但页面在最新的浏览器里并不能正确表现。那是你书写了无效的XHTML和CSS.你使用了W3C标准的文档对象模型(DOM)来操作页面动态元素。而在浏览器去表现这些标准时,你的站点失效了。这很有可能就是一个错误的文档类型(DOCTYPE)导致的。这篇文章就是为你提供DOCTYPE是如何任务的,还有解释一些实际真实世界中这些文档类型的用法。

为什么使用文档类型(Why a DOCTYPE?)

依据HTML和XHTML标准,一个DOCTYPE("document type declaration"的简写)是用来通知浏览器你使用的是哪一个版本的(x)HTML,而且必须出如今每一个页面的顶部。DOCTYPE是网页的一个重要构成:没有他们,你的CSS将不再无效。

就像之前提及的ALA文章里(其它风趣的地方也同样),DOCTYPE也要顺应其它的浏览器,比如Mozilla, IE5/Mac, 或者IE6,IE7。

一个新的DOCTYPE包含了一整个URI(sconf注:Universal Resource Identifier,通用资源标志符)(一个完整的网址),它通知那些浏览器去把页面解析(render)成与标准相适的模型。把(X)HTML, CSS和DOM处理成你所期望的那样。

使用一个不完善或是旧的的DOCTYPE,甚至不使用DOCTYPE,它会使浏览器把它转化成“Quirks”模型,此时浏览器假设你写的是过时的,残缺的90年代后的代码。

这样设置,浏览器将尝试用旧的标准解析你的页面,把你的CSS解析成IE4标准。并且回复所有者一个特殊的DOM(IE回复的是IE的DOM,Mozilla和Netscape 6回复的却是他们认为的模型)。

无疑,这并不是你所想要的。但却是你常得到的。所以本文就想要纠正这些不正确或是不完整的DOCTYPE。

(注:Opera浏览器不支持这些规则,它总是尝试把网页解析成标准顺应型,别一方面,Opera对W3C的DOM也没有提供太强无力的支持。但他们也能很好的运转)Ed:自从这篇文章第一次发布以来,Opera曾经把顺应的DOM(DOM-compliant)加到Opera7里面了。

DOCTYPE去哪了?(Where HAVE ALL THE DOCTYPES GONE?)

虽然文档类型在浏览器中的WEB标准是重要的无机构成,虽然W3C领导创建了WEB标准,你也同样期望W3C的站点能提供一些合适的文档类型,你也可能想更迅速简单的找到这些信息,然而,在我写这篇文章的时候,你还不能。{Ed:W3C如今列出了一系列标准的DOCTYPEs在他的网站上,你能够在W3C指南中看到这些,比如"My Web site is standard. And yours?”}

W3.org不是A List Apart, WebReference或者Webmonkey.它原来无意于协助WEB设计者,开发者,还有民间团体去加快他们认识和使用最新的科技。这不是他的任务。

W3C发布一系列的指南,虽然大多数的WEB设计者很少察觉。#

你能在W3.org上整天的搜索DOCTYPEs而不必去看那些专门的列表。并且当你确实下载一个DOCTYPE(普通是关系到一些特殊的建议或任务草案),而它并不能不正常的在你的站点任务。

遍及W3C站点的是缺失URIs(sconf注:即不是完的URI)的DOCTYPEs,这些DOCTYPEs是指向W3C本人网站的。一旦这些从W3C上转移到你本人的网页上,这些URLs就会成为不存在的文档了。

举个例子中,许多站点的DOCTYPE是直接复制的W3.org上的:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">

如果你看到了这个DOCTYPE的最后一部分("DTD/xhtml1-strict.dtd").你会发现这是一个对W3C站点的绝对链接。这是在W3C站点上的而不是你的。所以这个URI对浏览器没有作用。(sconf注:当你访问W3.org时,由于这是一个绝对链接,所以才起作用)。

这个DOCTYPE实际上应该改成:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

留意到后面的DOCTYPE包含了一个完整的URI。这样一来就显示了一个网络上的无效资源,浏览器就可以找到它,并把你的文档解析成标准顺应(standards–compliant)型。

如何使用DOCTYPE(DOCTYPES THAT WORK)

那么DOCTYPE是该如何使用呢?很快乐你会这样问。下面完整的DOCTYPE就是我们所需求的:

HTML 4.01 严谨型,过渡型,框架型

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">

XHTML 1.0 严谨型,过渡型,框架型

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

XHTML1.1 DTD

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">