doctype嗅探(也叫doctype转换)
现代浏览器使用doctype嗅探来决定text/html文档的引擎模式。这意味着模式的选择是基于HTML文档开始的文档类型声明(或缺少)。(这不适于使用XML文档类型的文档。)
文档类型声明(doctype)是SGML的语法伪造,SGML是个旧式的标记框架,HTML5之前的HTML就是依据其定义的。HTML4.01规范中,文档类型声明描述的是HTML的版本信息。尽管名字叫“文档类型声明”且HTML 4.01规范所描述的是关于“版本信息”,文档类型声明并不适用把SGML或XML文档分类为特定类型的文档,即使它看起来像是(因为名字)。(更多内容在附录中)
HTML4.01规范和ISO 8879(SGML)都没有说关于使用文档类型声明作为引擎模式转换的任何事情。doctype嗅探是基于观察,在doctype嗅探被设计时,绝大部分的怪癖文档既没有文档类型声明也没有引用旧的DTD。HTML5接受这个事实,且定义了text/html中doctype作为唯一的模式转换。
典型的预HTML5(pre-HTML5)文档类型声明包含(被空白分开)“字符串,根元素(“html”)的通用标识符, “PUBLIC”字符串,处于引号中的DTD公共标识符,同一DTD的可能系统标识符(URL)和字符 “>”。文档类型声明位于文档的根元素开始标签之前。
选择Doctype
text/html
下面是创建新的text/html文档时如何选择doctype的简单指南:
- 标准模式,最前沿的验证
如果想验证诸如和ARIA这样的新特性,那么这样做是对的。注意,HTML5的有效定义依旧在变化中,请确保在Firefox、Safari、Chrome、Opera9或Opera10中测试图像对齐。在Internet Explorer中测试图像对齐是不足够的,无论如何请确保在IE8中也进行了测试。
- 标准模式,更稳定的验证目标
这个doctype也会触发标准模式,但是由于对新功能不了解,这些传统的验证不是很精确,为避免你的组织需要进行对验证目标的守旧的策略。你还是应该把使用修改为你们组织的设计策略。
另外,如果你使用表格显示切片图像,你最好使用标准模式。
它会触发近乎标准模式。请注意,如果以后移植到HTML5上,基于利用表格实现的切片图像的布局可能会被破坏(完整标准模式也如此)。所以最好现在就确认你的设计是兼容标准模式的吧。
- 故意要使用怪癖模式
没有doctype。
请别这样做。故意为怪癖模式所做的设计将会困扰你、你的同事以及你未来的继任者。
如果你仍然想支持IE6,对IE6使用条件注释做一个特别的hack比应用怪癖模式更好。
我不推荐任何的XHTML doctype,因为XHTML被用作text/html被认为是有害的。如果你选择使用XHTML doctype,那么请注意XML声明会使IE6触发怪癖模式(IE7不会)。
**
application/xhtml+xml**
对application/xhtml+xml的简单指南是绝不使用doctype。该方式下的网页不是“严格一致”的XHTML1.0,但这并不重要。(请看后面的附录)
IE8/9/10相关的问题
A List Apart上的这篇文章介绍说,IE8除doctype外会使用基于meta元素的模式转换作为模式选择的因素之一。(请看Ian Hickson、David Baron、David Baron again、Robert O’Callahan和Maciej Stachowiak的评论。)
IE8有4种模式:IE5.5怪癖模式、IE7标准模式、IE8 近乎标准模式和IE8标准模式。IE9有7种模式:IE5.5怪癖模式、IE7标准模式、IE8 近乎标准模式、IE8标准模式、IE9 近乎标准模式、IE9标准模式和IE9 XML模式。IE10有11种模式:IE5.5怪癖模式、IE7标准模式、IE8 近乎标准模式、IE8标准模式、IE9 近乎标准模式、IE9标准模式、IE9 XML模式、IE10怪癖模式、IE10近乎标准模式、IE10标准模式以及IE10 XML模式。模式的选择取决于来自几个方面的数据:doctype、meta元素、HTTP头、来自微软的定期下载数据、局域网域、用户所做设置、局域网管理员所做设置、父框架的模式(如果有)和地址栏兼容视图按钮被用户触发。(对于嵌入该引擎的其他应用,模式也取决于嵌入的应用。)
幸运的是如果出现下列情况,IE8/9大体上会像其他浏览器一样使用doctype嗅探,而IE10则会严格地使用doctype进行嗅探:
- 作者没有设置X-UA-Compatible HTTP头
- 作者没有设置X-UA-Compatible meta标签
- 域名没有被微软添加到黑名单中
- 局域网管理员没有把该站点放置到黑名单上
- 用户没有按下兼容视图按钮(或以其他方式添加到某个特定的用户黑名单中) (Metro IE10 没有此按钮, 但是桌面里IE10的兼容视图也会影响到Metro模式下的IE10)
- 该站点不在局域网域中
- 用户没有选择以IE7模式显示所有站点
- 页面没有通过frame嵌入到兼容模式的页面中
上述除两个关于X-UA-Compatible的情况外,IE8/9像IE7一样执行doctype嗅探。IE7 emulation就是兼容视图。
在 X-UA-Compatible 情况下,IE8/9的行为和其他浏览器完全不同。想看本页的附录或PDF和PNG格式的流程图。 (与其它浏览器图表的对比:PDF格式) 还有一个从IE5.5到IE9的统一的图 (包括了 Chrome Frame):PDF格式. (我打算做一个只包含IE9的这么一张图)
不幸的是,没有 X-UA-Compatible的HTTP头或meta标签,即使使用了合适的doctype,IE8/9让用户无意间使页面从标准模式降到IE7模式,这是一种仿真的IE7标准模式。更糟糕的是,局域网管理员也可以这么做。微软也可以把你所用的所有域名到列入黑名单(比如mit.edu)。
为了对付这些影响,doctype是不够的,你需要X-UA-Compatible HTTP头和meta标签。
如果一个新的页面已经使用doctype触发了其它浏览器的标准模式,或者近乎标准模式。那么下面的内容将指导你如何利用X-UA-Compatible HTTP头或meta标签:
你的域名没有在微软的黑名单上,而且你更关心网页里没有使用那些令人讨厌的浏览器专属内容,而不在乎用户能不能使用IE7模式显示你的网页。
- 你不需要添加X-UA-Compatible HTTP头或meta标签。
你的域名在微软的黑名单中,或者你的域名里有些网页有问题而导致用户可能会对整个域启用兼容视图,你担心Google或Digg用frame嵌入你的站点,或你想确保用户不能对你的网页使用兼容视图
你可以将此meta标签添加在你的网页里所有脚本之前(在HTML5中该标签是不合法的):;或者为你的页面设置此HTTP头:X-UA-Compatible: IE=Edge。
- 你的网站在IE7下运行良好,在IE8/9下不能正常运行
首先你可以将此meta标签添加在你的网页里所有脚本之前(在HTML5中该标签是不合法的):;或者为你的页面设置此HTTP头:X-UA-Compatible: IE=EmulateIE7。
然后将你的网站修复为不依赖任何非IE7标准的内容,并迁移到IE=Edge。
- 你的网站在IE8下运行良好,在IE9下不能正常运行
首先你可以将此meta标签添加在你的网页里所有脚本之前(在HTML5中该标签是不合法的):;或者为你的页面设置此HTTP头:X-UA-Compatible: IE=EmulateIE8。
然后将你的网站修复为不依赖任何非IE8标准的内容,并迁移到IE=Edge。
- 你的网站在IE9下运行良好,在IE10下不能正常运行
首先你可以将此meta标签添加在你的网页里所有脚本之前(在HTML5中该标签是不合法的):;或者为你的页面设置此HTTP头:X-UA-Compatible: IE=EmulateIE9。
然后将你的网站修复为不依赖任何非IE9标准的内容,并迁移到IE=Edge。
Google Chrome Frame相关的问题
Google Chrome Frame 是一个适用IE6/7/8/9的浏览器扩展和插件,它使用IE的网络连接但是添加了Google Chrome引擎。安装之后默认还是IE的行为,但是网页却可以使用一个X-UA-Compatible的HTTP头,或者一个meta标签切换到Chrome引擎上。
在任何安装了Chrome Frame的浏览器环境下设置X-UA-Compatible为chrome=1,都会激活Chrome Frame。如果设置X-UA-Compatible为chrome=IE6,则只会为IE6激活Chrome Frame。如果设置X-UA-Compatible为chrome=IE7,则只会为IE6和IE7激活Chrome Frame。如果设置X-UA-Compatible为chrome=IE8,则只会为IE8及以下的浏览器激活Chrome Frame。
这些激活Chrome Frame的指令可以与激活其它IE兼容模式的指令合并起来一起控制IE使用的引擎,使用逗号或分号将这些指令分隔即可,比如:。
网页一旦激活了Chrome Frame,那么就像在普通的Chrome里那样的选择这四种模式(标准模式、近乎标准模式、怪癖模式、XML模式)之一了。
但是,还有两个避免使用Chrome Frame的关键因素:
- Chrome Frame不支持IE的可访问性支持。如果激活了Chrome Frame,IE里的内容区域就不能使用IE的可访问性支持了,这就意味着屏幕阅读器以及Window语音识别不能在Chrome Frame下正常运行。
- 你的网站应该告诉那些将要安装Chrome Frame的用户,启用网站安装防御模式,以告诉用户他们为了使用这个网站需要在本机安装一个有权限的本地代码插件。
相关网页链接
- Eric Meyer写的关于Mac IE 5的模式 Use the Right Doctype
- Mozilla’s DOCTYPE sniffing 作者:David Baron
- CSS Enhancements in Internet Explorer 6 作者:Lance Silver,讨论了Windows IE6的模式以及doctype嗅探
- The Opera 9 DOCTYPE Switches
- Faruk Ateş写的关于IE8的 IE8 and the X-UA-Compatible situation
补遗:对XML的实现者和规范作者的恳求
请不要把doctype嗅探带到XML。
doctype嗅探是用标签杂烩汤似的方法解决一个标签杂烩汤问题。doctype嗅探是在HTML4和CSS2规范发布后设计的一种试探方法,它从文档中区分出过时文档以符合其作者可能期望的行为。
偶尔有人建议在XML上使用doctype嗅探来调度不同的处理、识别正在使用的词汇表或激活特性。这是个坏主意。调度和词汇表识别应该是基于名字空间的,而特性激活应该是基于明确的处理指令或元素。