日期:2014-01-09 浏览次数:20859 次
为了处理依据Web标准创作的网页和依据在20世纪90年代末流行的陈旧实践创作的网页,现代的Web浏览器实现了各种不同的引擎模式。本文说明了那些模式是什么以及如何触发它们。
本文包括的模式转换(mode switching)适用于Firefox和其他基于Gecko的浏览器,Safari、Chrome和其他基于Webkit的浏览器,Opera、 Konqueror、Mac版Internet Explorer、Windows版Internet Explorer和内嵌IE的浏览器。避免提及浏览器引擎的名字,取而代之的是使用该引擎最知名浏览器的名字。
本文着重引见模式的选择机制,而不是记录每个模式的确切行为。
以下是各种不同的模式:
text/html内容的模式选择取决于doctype嗅探(doctype sniffing,本文后面有讨论)。在IE8中,模式也取决于其他要素。然而在IE8的默认情况下,那些不在微软提供黑名单上的非局域网(non- intranet)站点的模式取决于文档类型。
再怎样强调每个浏览器中模式精确行为的不同也是不过分的,即便本文中进行了统一的讨论。
Firefox、Safari、Chrome和Opera中,application/xhtml+xml HTTP内容类型(不是meta元素也不是doctype!)会触发XML模式。在XML模式中,浏览器尝试给XML文档在规范上的正确处理达到在制定浏览器中的程度。
IE6、7和8不支持application/xhtml+xml,Mac IE5也如此。
基于WebKit的Nokia S60 浏览器中,application/xhtml+xml HTTP内容类型不能触发XML模式,由于在挪动的围墙花园(mobile walled gardens)中关注点是对不规范内容的兼容性。(旧式的“挪动浏览器”无法使用真正的XML解析器,由于不规范内容已被标记为XML。)
由于没有充分地测试Konqueror,我无法确切说出在这个浏览器中会发生什么。
某些引擎拥有的模式与Web内容无关。为了完整性,它们仅仅在这里被提到。Opera有个WML2.0模式。Leopard上的WebKit有个用于旧式Dashboard widgets的特定模式。
以下是这些模式的次要影响:
text/html的模式次要是影响CSS规划。例如,表格不承继款式是个怪癖。在某些浏览器的怪癖模式下,盒模型(box model)变成IE5.5的盒模型。本文档没有列举出所有的规划怪癖。
准标准模式(有这种模式的浏览器中)中,仅包含图片的表格单元格的高和标准模式中不同。
XML模式中,选择器有不同的区分大小写行为。此外,用于HTML body元素的特有规则不能使用在那些没有实现最新CSS2.1改变的较旧版本的浏览器。
也有一些怪癖影响HTML和CSS的解析且会导致符合标准的网页被错误解析。怪癖规划决定了这些怪癖能否开启。无论如何,了解怪癖模式和标准模式在CSS规划和解析(非HTML解析)上的次要异同是非常重要的。
一些人错误地把标准模式称为“严厉解析模式(strict parsing mode)”,其让人误解了浏览器强制执行HTML语法规则和用浏览器评估标记的正确性。情况并非如此。即便当标准模式规划生效时,浏览器照旧会做标签杂烩汤(tag soup,http://en.wikipedia.org/wiki/Tag_soup)修正任务。(在2000年Netscape6发布前,Mozilla的确有用于强制执行HTML语法规则的解析模式。这些模式和现有的Web内容不兼容而被遗弃。)
另一个常见的误解是关于XHTML解析的。通常认为用XHTML doctype得到不同的解析。其实并非如此,内容类型是text/html的XHTML文档所用解析器和HTML文档的是同一个。目前浏览器在意的是文档类型为text/html的XHTML仅是“撒面包丁的标签杂烩汤(tag soup with croutons)”(四处是额外的斜线)。
仅当使用XML文档类型的文档(例如:application/xhtml+xml或xmapplication/)会触发XML模式来解析,这时的解析器完全不同于HTML解析器。
虽然怪癖模式次要是关于CSS的,但也有一些是关于脚本的。例如,Firefox的怪癖模式中,HTML id 属性像在IE一样建立了全局脚本作用域的对象援用。IE8中关于脚本的影响比其他浏览器更值得关注。
XML模式中,某些DOM API的行为彻底不同,由于XML的DOM API行为被定义时不兼容HTML的行为。
现代浏览器使用doctype嗅探来决定text/html文档的引擎模式。这意味着模式的选择是基于HTML文档开始的文档类型声明(或缺少)。(这不适于使用XML文档类型的文档。)
文档类型声明(doctype)是SGML的语法伪造,SGML是个旧式的标记框架,HTML5之前的HTML就是依据其定义的。HTML4.01规范中,文档类型声明描述的是HTML的版本信息。虽然名字叫“文档类型声明”且HTML 4.01规范所描述的是关于“版本信息”,文档类型声明并不适用把S