日期:2014-05-17  浏览次数:20599 次

html5系列2-4 : DOCTYPE与渲染模式(四)

      在这节开头我们先来细究一下XHTML 1.0 Transitional 这个目前使用最广泛的文档类型。在2-3中讲了XHTML对HTML的改进。可是,在这里我要强调一点:其实,目前大多数网站虽然使用XHTML的DTD,但是并没有使用XHTML所推荐的类似XML的德拉科(Draco)式错误处理,即出现哪怕只有一个错误,也必须停止执行,并将错误信息显示给用户。

      为何这么说呢?首先,不得不提一下XHTML 1.0 规范中的一个漏洞:任何以text/html这个MIME类型发布的页面,不管它用的什么doctype,都将被一个“宽容”的HTML解析器所处理,悄无声息地忽略掉任何代码错误,绝不会给出警告。所以,可以看到很多的网页虽然将DTD声明为XHTML 1.0 Transitional,页面也使用XHTML的语法规则,可是却使用text/html的MIME类型发布。大家只要看到页面源码中有以下的内容就是我说的这种情况:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">

      XHTMl 1.0 里包含的这个漏洞在XHTML 1.1 中被关闭,而XHTML2.0 也延续了这个德拉科式错误处理的传统。这就是为什么有数十亿的网站声明是XHTML 1.0的,但只有很少数的网页声明为XHTML 1.1(或者XHTML 2.0)。除非你使用application/xhtml+xml这个MIME类型来发布你的页面,否则你所谓的“XHTML”只是名义上的XML而已。

      接下来我要问一个非常“”的问题:既然W3C要用XHTML来替换HTML,为何又会出现HTML5?

     这是一个非常有意思的问题,也是一个非常重要的问题,对它的回答不仅仅是陈述历史,更会让你明白什么是HTML5,他与XHTML有何不同,相信我这很重要。

      从前面的介绍中,我们可以看出,XHTMl尤其是1.1之后的版本,和HTML是不兼容的。并且,新一代的表单XForms也和HTML表单不兼容,因为它只能用在以新的XHTML MIME类型发布的文档中。这种破坏向后兼容性的行为抹杀了十多年来HTML上的成果,甚至会造成99%的现有网页无法正常显示。这种想让HTML一步进入XML时代的理想主义行为,显然得不到市场的认可。最终,XHTML2.0 悲剧了。

      在W3C还执着于XHTML2.0的时候,WHAT(Web Hypertext Application Technology)小组成立了,这个工作小组是一个松散的,非官方的,开放的协作组织。WHAT小组采用了与XHTML截然不同的方法:将浏览器实际所用的那些“宽容”的错误处理算法文档化。Web浏览器一直都对HTML中的错误宽容对待,但从来没有人费心去记录下它们到底是怎么做的。NCSA Mosaic有自己的算法来应对有错误的页面,Netscape也试图做到同样的事情与之媲美。后来IE也试图媲美Netscape。再然后,Opera和Firefox也试图媲美IE。再后来Safari试图媲美Firefox。以此类推,一路走来,开发者们耗费了无数的时间来让自己的产品与竞争对手的产品相兼容。用了好几年,WHAT小组成功将“如何以兼容现有Web内容的方式解析HTML”文档化了(除去个别情况)。最终的算法中完全没有强制HTML停止处理并显示错误信息的步骤。

      在WHAT小组取得重大成果后,W3C决定与WHAT小组合作开发下一代HTML,并在2009年解散了XHTML2.0的工作小组。于是乎,在W3C与WHAT小组的合作下HTML5诞生了。