设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

通过Doctype启用浏览器模式

2014-8-7 11:17| 发布者: joejoe0332| 查看: 4439| 评论: 0|原作者: hizzgdev|来自: 开源中国社区

摘要:   为了即能解析那些满足Web标准的网页,又能解析那些过去20年来遗留下来的传统的网页,现代浏览器一般都实现了多种网页解析的模型。本文将介绍这些解析模型都是什么,以及它们是如何触发的。 内容概述   本 ...


Google额外提供的一些IE-Specific模式

  当安装了Google Chrome Frame后,IE6/7/8/9(不包括Windows8以及2013年2月的Windows7上的IE10)还可提供以下这些额外的模式。

  • Chrome Quirks

此模式相当于Google Chrome上的怪癖模式。

  • Chrome Standards

此模式相当于Google Chrome上的标准模式。

  • Chrome Almost Standards

此模式相当于Google Chrome上的近乎标准模式。


非Web模式

  有些模式还提供了一些与Web内容不相关的模式。在这里提到这些模式仅仅出于对此文档的完整性考虑。包括Opera的WML2.0模式,Mac OS X 10.5上WebKit浏览器上的特殊模式(用于传统的Dashboard  widgets,或许这个模式目前仍有更新,我没有考察不是很确定)。以及为Mac OS X上内嵌WebKit浏览器的应用程序单独提供的模式。


模式的影响

模式的主要影响如下:

页面布局

  除IE外,对于text/html类型的模式主要影响样式表布局以及样式系统。例如,表格内不会继承样式表;在IE和Opera的老版本中的怪癖模式下,盒模型变成了IE5.5的盒模型。本文档并不会枚举所有的怪癖布局,你可以查阅 Mozilla文档 以及 怪癖模式标准 获得完整列表。

  在近乎标准模式中(在所有包含此模式的浏览器中),仅含有图片的单元格高度的计算方式与标准模式不同。

  在XML模式中,选择器对查询条件的大小写有不相同的处理行为,另外,对于那些没有实现更多的样式表规范的老版本浏览器中,并不包含对body元素的特殊规则。


内容解析

  也有一些差异会影响到HTML和CSS的解析,并且可能会导致一些正常的页面被错误的解析。 这些差异会随着对布局的影响而同时产生影响。重要是要知道怪癖模式和标准模式的主要差别在于CSS布局和CSS的解析,而不是对HTML的解析。对于已经 兼容HTML5的浏览器,也有一些关于HTML解析的差异

  一些人会把标准模式误认为是“严格解析模式”,他们会觉得这样的话,浏览器会强制遵守HTML语法规则,会对HTML标记的正确性进行评估。事实上 既然在标准模式下,浏览器仍会对HTML标签进行必要的修复。(2000年夏,Netscape 6 发布前,Gecko浏览器确实包含一些强制按HTML语法规则进行解析的模式,其中一种模式称为“标准定义”,这些模式并不能兼容目前的网页内容,已经过 期了。)

  另 外一个常见的误解是关于解析XHTML的。大家通常认为声明为XHTML的doctype会带来不同的解析。事实上XHTML文档也是text/html 类型的,也只是“蛋花标签汤”而已,到处都是额外的斜线》只有文档以XML类型(如application/xhtml+xml或application /xml)输出时才会触发与HTML解析完全不同的XML模式的解析。


脚本

  虽然怪癖模式主要影响的是CSS,但是还有一些脚本也会受到影响。直到Firefox14,其近乎标准模式下,还是不能直接使用标签的ID来引用标 签对象。在Firefox的怪癖模式中有document.all对象,但是在其它模式中却没有该对象。当在IE中模拟低版本IE时,这些影响更搞笑。

  在XML模式中,一些DOM API表现很不一样,因为对XML的DOM API与HTML是完全不同的,唉,实在很遗憾。


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)文档类型声明包含(被空白分开)“”。文档类型声明位于文档的根元素开始标签之前。 


选择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 HicksonDavid BaronDavid Baron againRobert O’CallahanMaciej 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的行为和其他浏览器完全不同。想看本页的附录PDFPNG格式的流程图。 (与其它浏览器图表的对比: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中该标签是不合法的):<meta http-equiv="X-UA-Compatible" content="IE=Edge">;或者为你的页面设置此HTTP头:X-UA-Compatible: IE=Edge。

  • 你的网站在IE7下运行良好,在IE8/9下不能正常运行

首先你可以将此meta标签添加在你的网页里所有脚本之前(在HTML5中该标签是不合法的):<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">;或者为你的页面设置此HTTP头:X-UA-Compatible: IE=EmulateIE7。

然后将你的网站修复为不依赖任何非IE7标准的内容,并迁移到IE=Edge。

  • 你的网站在IE8下运行良好,在IE9下不能正常运行

首先你可以将此meta标签添加在你的网页里所有脚本之前(在HTML5中该标签是不合法的):<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8">;或者为你的页面设置此HTTP头:X-UA-Compatible: IE=EmulateIE8。

然后将你的网站修复为不依赖任何非IE8标准的内容,并迁移到IE=Edge。

  • 你的网站在IE9下运行良好,在IE10下不能正常运行

首先你可以将此meta标签添加在你的网页里所有脚本之前(在HTML5中该标签是不合法的):<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9">;或者为你的页面设置此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使用的引擎,使用逗号或分号将这些指令分隔即可,比如:<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=IE8">。

网页一旦激活了Chrome Frame,那么就像在普通的Chrome里那样的选择这四种模式(标准模式、近乎标准模式、怪癖模式、XML模式)之一了。

但是,还有两个避免使用Chrome Frame的关键因素:

  • Chrome Frame不支持IE的可访问性支持。如果激活了Chrome Frame,IE里的内容区域就不能使用IE的可访问性支持了,这就意味着屏幕阅读器以及Window语音识别不能在Chrome Frame下正常运行。

  • 你的网站应该告诉那些将要安装Chrome Frame的用户,启用网站安装防御模式,以告诉用户他们为了使用这个网站需要在本机安装一个有权限的本地代码插件。

相关网页链接



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部