用doctype激活浏览器模式(4)
作者:秦歌 来源:随网之舞 时间:2009-06-15 19:02:00
相关链接
Eric Meyer在使用正确doctype中写的关于Mac IE5的模式
Mozilla的doctype嗅探 by David Baron
Lance Silver在IE6中的CSS增强中讨论了在Windows IE6中的模式和doctype嗅探
Faruk Ateş的IE8和X-UA-Compatible解决方案
补遗:对XML的实现者和规范作者的恳求
请不要把doctype嗅探带到XML。
doctype嗅探是用签杂烩汤似的方法解决一个标签杂烩汤问题。doctype嗅探是在HTML4和CSS2规范发布后设计的一种试探方法,它从文档中区分出过时文档以符合其作者可能期望的行为。
偶尔有人建议在XML上使用doctype嗅探来调度不同的处理、识别正在使用的词汇表或激活特性。这是个坏主意。调度和词汇表识别应该是基于名字空间的,而特性激活应该是基于明确的处理指令或元素。
良构(well-formedness)的整个思想是介绍允许XML的无DTD解析,且推广无doctype文档。在正式情况下,两个XML文档有相同的规范形式且应用不同地处理它们(且不同之处并非因为没有选择处理外部实体),这个应用或许被破坏了。在实践情况下,如果两个XML文档导致同样的内容被报告(qnames忽略)给SAX2内容处理器且应用不同地处理文档,这个应用或者被破坏了。考虑到作为 Web作者无法相信每个人都会使用解决额外实体的XMLprocessor来解析其页面(即使一些浏览器看起来这样做,因为它们会映射一定公共的标识符到一个有删节的定义实体的DTD),插入doctype到XML中用于Web是毫无意义的且通常会导致货运崇拜(cargo cultish)习惯。(您仍然使用W3C验证器的DTD覆盖功能来对一个DTD进行验证,虽然W3C验证器会说结果仅仅是暂时有效。或更好的是,你可以用放宽NG验证,它不会污染模式引用的文档。)为了嗅探而要求doctype是非常愚蠢的,即使那是在HTML实践中的解决方法。
此外,当低级别的规范定义两个相等的东西时,高级别的规范不应该尝试给它们不同的含义。请考虑<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
。如果删除公共标识符,依旧指定了同样的DTD,因此doctype <!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
表示和前面的doctype一样。应该不同地嗅探它们么?可以进一步理论。假设复制给example.com一个叫foobar.dtd的DTD:<!DOCTYPE html SYSTEM "http://example.com/foobar.dtd">
。这该如何嗅探?应该是同一个意思。甚至整个DTD可以贴在文档中。
换句话说,如果有#include “foo.h”,你不应该给名字foo.h绑定任何black magic,因为它应该允许复制foo.h的内容到文档中或复制foo.h到bar.h中且表示#include “bar.h”。
我不担心HTML和SGML构造相同的参数的原因是Web浏览器不会使用真正的SGML解析器去解析HTML,所以我认为伪装成SGML进行处理是没有用的。无论如何,如果你还不相信,请看W. Eliot Kimber关于此事的文章 comp.text.sgml
附录:text/html中一些doctype的处理方式
下表中,怪癖模式、标准模式和几乎标准分别表示为Q、S和A。当浏览器仅有两种模式时,如果表格单元格的行高和Mozilla的标准模式表现一致时,标准模式标记为“S”,如果表格单元格的行高和Mozilla的几乎标准模式表现一致时,则标记为“A”。
请注意使用XML内容模型提供服务的XHTML在XML模式下渲染。
本表的目的并不是说表中所有的doctype都是新建页面的合理选择。本表的目的是为了展示我的推荐是依据什么样的数据。
下列的简写符号是用于列标题:
NS6
Mozilla 0.6…0.9.4 和 Netscape 6.0…6.2.3
Old Moz
Mozilla 0.9.5 到 1.1 alpha 和 Mozilla 1.0
Moz & Safari & Opera 10 & HTML5
Mozilla 1.0.1, Mozilla 1.1 beta和更高版本, Firefox 到 Netscape 7, Safari 0.9 到 Safari 4.0 beta, Opera 10, Chrome, Konqueror 3.5, HTML5指定的行为
Opera 9.0
Opera 9.0…9.20
IE 8 & Opera 9.5
无 X-UA-Compatible和兼容模式覆盖的默认IE8(该情况下“A”意味着IE8几乎标准模式)、 Opera 7.5…8.54 和 9.5…9.6
IE 7 & Opera 7.10
IE7、兼容模式且无X-UA-Compatible覆盖的IE8(这种情况下“A”意味IE7模式)和Opera 7.10…7.23
IE 6 & Opera 7.0
Windows IE 6 和 Opera 7.0…7.03
Mac IE 5
Mac IE 5.0…5.2.3
Konq 3.2
Konqueror 3.2.2…3.3 (也可能包括 3.1…3.2.1; 我尚未确定)
运行代码框