使用 Doctype 激活浏览器模式

        为了同时处理根据 Web 标准编写的网页内容和根据 20 世纪 90 年代后期盛行的传统做法编写的网页内容,当今的 Web 浏览器实现了各种引擎模式。本文档解释了这些模式是什么以及如何触发它们。

总结

        本文我们得出的主要结论是,在所有HTML文档(即任何作为 text/html 内容的文件)中,你应该将  作为源代码中的第一行。(请阅读下文了解原因)

       如果你想特别注意确保 IE8、IE9 或 IE10 的用户无法按下某个按钮,使你的网站倒退到像在IE7中查看的样子,你可以配置服务器发送 HTTP 标头 X-UA-Compatible: IE=Edge ,内容类型为 text/html 或在 HTML 文档的头部(在任何脚本之前)放置   。然而,IE11 版本之前的默认行为在大多数情况下是合理的,而 IE11 不再将兼容性视图按钮放在工具栏中,所以你不需要攻克这些特定于 IE 的障碍。(继续阅读以了解例外情况。)

本文档的范围

        本文档涵盖了模式切换,因为它适用于 Firefox 和其他基于 Gecko 的浏览器、Safari 和其他基于 Webkit 的浏览器、Chrome、新版 Edge、Opera 和其他基于 Chromium 的浏览器、Konqueror、Mac版 Internet Explorer、Windows 版 Internet Explorer (包括 Windows Phone) 和嵌入 IE 的浏览器,以及基于 EgdeHTML 的 Edge。本文档没有使用浏览器引擎的名称,而是使用了每个引擎所对应最知名的浏览器名称。

       本文档侧重于模式选择机制,而不记录每个模式的精确行为。本文档目的是为您提供有关如何避免使用旧版模式的信息,并进行足够的研究以令人信服。本文档目的不是为了故意选择旧模式来促进选择性行为。

模式

以下是各种模式:

  文本/html 内容的通用模式

        text/html 内容模式的选择取决于文档类型嗅探(本文档稍后讨论)。在 IE8 到 IE11(不包括 Microsoft Edge)中,模式还取决于其他因素。然而,默认情况下,即使在 IE8 及更高版本中,对于不在微软提供的例外列表中的非内网网站,模式也取决于 Doctype。此外,如果安装了谷歌Chrome 框架,即使使用 IE6 和 IE7,也会涉及其他因素。

        Quirks 模式(怪癖/混杂模式)

        在怪癖模式下,浏览器会违反 Web 格式规范,来避免 "破坏" 按照 20 世纪 90 年代末流行的实践编写的页面。以前,不同的浏览器实现了不同的怪癖 。特别是在 IE6、IE7、IE8 和 Ie9 中,怪癖模式实际上是冻结的 IE 5.5,而在其他浏览器中,怪癖模式是从几乎标准模式中的少数偏离。最近,浏览器已经在它们的怪癖模式中收敛了一些常见的行为。最值得注意的是,IE10 和 IE11 的主要怪癖模式不再是对 IE 5.5 的仿照,而是寻求与其他浏览器的怪癖模式互操作。可互操作的 Quirks 正在被标准化为 WHATWG。        

        IE10 和 IE11 的主要怪癖模式与其他浏览器的怪癖模式类似,有时也被称为 "可互操作的怪癖模式" ( Interoperable Quirks Mode ),以区别于 IE10 和 IE11 也具有的仿造 IE 5.5的“Internet Explorer 5 Quirks”模式。

        如果您正在编写新页面,请不要使用 怪癖模式,请使用标准模式。

        标准模式

        在标准模式下,浏览器尝试根据规范正确处理文档,以实现特定浏览器所追求的程度。

        由于不同浏览器处于兼容性阶段的差异,因此标准模式并非唯一目标。

        HTML 规范将此模式称为 "无怪癖模式"。

        几乎标准模式

        Firefox, Safari, Chrome, Edge, Opera (从 7.5 开始),IE8, IE9, IE10 和 IE11 也有一种称为 "几乎标准模式" 的模式,它按照传统方式而不是按照 CSS2 规范实现表格单元格的垂直尺寸。Mac IE 5、Windows IE 6 和 7、Opera 7.5 之前的版本和 Konqueror 都不需要几乎标准模式,因为它们在各自的标准模式下都没有按照 CSS2 规范实现表格单元格的垂直尺寸。事实上,它们的标准模式更接近几乎标准模式,而不是较新浏览器的标准模式。

        回顾过去,如果 Web 不区分标准和几乎标准之间的区别,将几乎标准行为作为默认行为,并将 CSS 属性用于选择规范模式中的默认行为,那么 Web 会更美好。尽管如此,我们还是应该使用标准模式,而不是几乎标准模式。

        HTML 规范称这种模式为 “有限怪癖模式” ( Limited Quirks Mode )。

  application/xhtml+xml 内容模式( XML 模式)

        在 Firefox 、Safari、 Chrome、 Opera 和 IE9 中,application/xhtml+xml HTTP 内容类型(既不是 meta 元素也不是 Doctype! )触发 XML 模式。 在 XML 模式中,这些浏览器为 XML 文档提供了规范明智的正确处理,并实现了特定浏览器的特定程度。

        IE 6,7 和 8,Mac IE 5 不支持 application/xhtml+xml。

        在基于 WebKit 的诺基亚 S60 浏览器中,application/xhtml+xml HTTP 内容类型没有触发 XML 模式,原因是对移动封闭生态中不良格式内容兼容性的考虑。

(传统的 "移动浏览器" 没有使用真正的 XML 解析器,因此格式不良的内容被标记为 XML。)

        我还没有测试 塞班3 的默认浏览器。

        我对 Konqueror 的测试还不够充分,无法说明在这个浏览器中到底发生了什么。

  特定于微软 IE 的 Web 内容可控附加模式

        以下是 HTML5 没有指定的、其他浏览器也没有的 IE 特定模式。它们的激活涉及配置或 X-UA-Compatible 作为 HTTP 标头或 meta 元素。

        Internet Explorer 5 Quirks

        除了可互操作的怪癖模式外,IE10 和 IE11 还有一种名为 "Internet Explorer 5 Quirks" 的模式,该模式仿照了 IE 5.5,其在 IE6、IE7、IE8 和 IE9 中被称为怪癖模式。

        Internet Explorer 7 标准

        IE8、IE9、IE10 和 IE11 有一种仿照了 IE7 标准模式的模式。

        Internet Explorer 8 标准

        IE9、IE10 和 IE11 有一种仿照了 IE8 标准模式的模式。

        Internet Explorer 8 几乎标准

        IE9、IE10 和 IE11 有一种仿照了 IE8 几乎标准模式的模式。在开发人员工具用户界面中,此模式与 IE8 标准模式没有区别。

        Internet Explorer 9

        IE10 和 IE11 有一种仿照了 IE9 标准模式的模式。

        Internet Explorer 9 几乎标准

        IE10 和 IE11 有一种仿照了 IE9 几乎标准模式的模式。在开发人员工具用户界面中,此模式与 IE9 标准模式没有区别。

        Internet Explorer 9 XML

        IE10 和 IE11 有一种仿照了 IE9 XML 模式的模式。在开发人员工具用户界面中,此模式与 IE9 标准模式没有区别。

        Internet Explorer 10 怪癖

        IE11 有一个仿照 IE10 可互操作怪癖模式的模式。在开发人员工具用户界面中,该模式与 IE10 标准模式没有区别。

        Internet Explorer 10 标准

        IE11 有一种仿照 IE10 标准模式的模式。在开发人员工具用户界面中,该模式与 IE10 标准模式没有区别。

        Internet Explorer 10 几乎标准

        IE11 有一种仿照了 IE10 几乎标准模式的模式。在开发人员工具用户界面中,该模式与 IE10 标准模式没有区别。

        Internet Explorer 10 XML

        IE11 有一种仿照了 IE10  XML 模式的模式。在开发人员工具用户界面中,该模式与 IE10 标准模式没有区别。


        值得注意的是,这些旧版本 IE 的模拟并不算完美。我自己遇到的一些例子包括:在较晚版本的 IE 中模拟 IE7 标准以不同的方式去处理 @font-face 类似的 EOT 字体,以及 IE10 的 IE9 模式支持 CSS 2D 转换时没有 -ms- 前缀,而真正的 IE9 则需要该前缀。如果您遵循本文档中给出的建议,您不会针对这些模式进行优化,因此在生产环境中这些模拟的不完美不会产生实际影响。但是,对于测试来说,最好在一组虚拟机中运行实际旧版本的 IE 来测试您的网站,而不是使用较新版本的 IE 开发人员工具来模拟旧版本进行测试。

        Windows Phone 8 的 IE10 也有这些模式,就像桌面版的 IE10 一样。

        基于 EdgeHTML 的旧 Spartan Edge 和基于 Chromium 的新 Anaheim Edge 都没有 Web 内容可控的 IE 模式,其行为与其他浏览器类似,请参见下面关于可以让 Spartan Edge 启动 IE11 或让 Anaheim Edge 在 Edge 的用户界面中加载 IE11 的本地配置。

  来自谷歌的 ie 特定附加模式

        以下是在已安装了已停用的谷歌 Chrome 框架时可用的其他模式,这些模式在 IE6、IE7、IE8 和 IE9 中可用(截至2013年2月,在Windows 8上的 IE10 或 Windows 7 中不可用)。

        Chrome 怪癖

        此模式与谷歌浏览器中的 "怪癖" 模式相同。

        Chrome 标准

        此模式与谷歌 Chrome 浏览器中的 "标准" 模式相同。

        Chrome 几乎标准

        此模式与谷歌浏览器中的几乎标准模式相同。

  企业模式和 IE11 模式

        上述讨论的模式是 Web 内容可以选择激活的模式。IE11 和基于 Chromium 的 Edge(Anaheim)还具有额外的模式,这里提到这些模式是为了完整性,它们不是本文的重点,因为它们不能由 Web 内容控制。

        IE11 具有称为企业模式的功能,允许本地管理员配置指定一些在 Enterprise 模式下加载的网站,这些网站可以作为 IE7 或 IE8 运行。这些模式声称比 IE7 和 IE8 的兼容性视图模式更能匹配实际的 IE7 和 IE8。目前还不清楚为什么会这样。这个说法暗示着企业模式加载的是 IE8 引擎的副本,而不是 IE11 引擎,具有条件分支来激活旧的行为,但我尚未找到可靠的消息来源来解释企业模式和兼容性视图在实现方面是如何不同的。

        基于 Chromium 的 Edge(Anaheim)具有称为 IE 模式的功能,允许本地管理员配置指定一些网站以在 IE11 或在 IE11 的企业模式下加载。这意味着 IE11 内部在 Edge 的用户界面中运行。

        相比之下,基于 EdgeHTML的Edge(Spartan)不会在其用户界面中运行 IE11,而是在遇到本地配置指定的需要 IE 的网站时启动实际的 IE11。(这意味着进一步导航到其他网站不会返回使用 Edge)

  非 web 模式

        有些引擎的模式与网页内容无关。在这里提到这些模式只是为了完整。基于 presto 的 Opera 有一个 WML 2.0 模式。Mac OS X 10.5 上的 WebKit 为传统的仪表板小部件提供了一个特殊的模式(也许这个模式在新版本中仍然存在——我没有研究过)。WebKit 也有在 Mac OS X 上嵌入 WebKit 的应用程序。

影响

以下是这些模式的主要影响:

        布局

        除了 IE 浏览器外,其他浏览器的 text/html 模式主要影响 CSS 布局和样式系统。例如,不将样式继承到表格是一种怪癖行为。在旧版本的 IE 和 Opera 中,怪癖模式中的盒模型会变为 IE 5.5 的盒模型。本文档并没有列举所有的布局特殊情况,如果想了解更多,可以参考 Mozilla 的文档和 Quirks 模式规范。

        在几乎标准模式(目前所有浏览器都有这个模式)中,与标准模式相比,只包含图像的表格单元格的高度计算不同。

        在 XML 模式下,选择器具有不同的大小写敏感性行为。此外,对于没有实现最新 CSS 调整的较旧浏览器版本,HTML body 元素的特殊规则不适用。

        解析

        还有一些怪癖情况会影响 HTML 和 CSS 的解析,导致符合标准的页面被错误解析。这些特殊情况可以通过奇特布局来开启和关闭。但是需要认识到,怪癖模式与标准模式主要是关于 CSS 布局和 CSS 解析的,而不是 HTML 解析。在具有 HTML5 兼容 HTML 解析器的浏览器中,只有一种 HTML 解析怪癖行为。

        有些人误称标准模式为 "严格解析模式",这个误解暗示浏览器强制执行 HTML 语法规则,并且可以用来评估标记的正确性。但事实并非如此,即使在标准模式布局生效时,浏览器也会进行标签集合的修复。(在 Netscape 6 发布之前的 2000 年夏天,Gecko 实际上有强制执行 HTML 语法规则的解析器模式,其中一种模式被称为“严格 DTD”。这些模式与现有的 Web 内容不兼容,被废弃了)

       另一个常见的误解与 XHTML 解析有关。人们常常认为使用 XHTML Doctype 会获得不同的解析。但实际上并非如此。以 text/html 方式提供的 XHTML 文档使用与 HTML 相同的解析器进行解析。就浏览器而言,以 text/html 方式提供的 XHTML 仅仅是 "带有面包屑的标签集合"(这里和那里多了一个斜杠)。只有使用 XML 内容类型(例如 application/xhtml+xml 或 application/xml )提供的文档才会触发 XML 模式进行解析,在这种情况下,解析器与 HTML 解析器完全不同。

        脚本

        虽然怪癖模式主要与 CSS 有关,但也有一些脚本方面的怪癖情况。在 Firefox 14 之前,HTML 的 id 属性在标准和几乎标准模式下不会从全局脚本范围建立对象引用。在 Firefox 中,document.all 在怪癖模式下部分可用,但在其他模式下不可用。当 IE 进入模拟旧版 IE 模式时,脚本受到的影响更大。

        在 XML 模式下,一些 DOM API 的行为会不同,因为 XML 的 DOM API 行为被定义为与HTML 行为不兼容。事后看来,这是相当不幸的。

文档类型嗅探(又称文档类型切换)

        浏览器使用文档类型嗅探来决定 text/html 文档的引擎模式。这意味着,该模式是基于 HTML 文档开头处的文档类型声明(或缺乏声明)而选择的。(这不适用于使用 XML 内容类型提供的文档)

        文档类型声明( Doctype )是 SGML 的语法产物—— SGML 是一种遗留标记框架,HTML 5 之前的 HTML 据称是用它来定义的。在 HTML 4.01 规范中,文档类型声明被称为传递 HTML 版本信息。尽管名为 "文档类型声明",并且 HTML 4.01 规范提到了 "版本信息",但文档类型声明并不是将 SGML 或 XML 文档归类为特定类型的合适手段,尽管它看起来应该是这样(因此而得名)。(关于这一点的更多内容请见附录。)

        无论是 HTML 4.01 规范还是 ISO 8879( SGML )都没有提到使用文档类型声明作为引擎模式切换。文档类型嗅探是基于这样的观察:在文档类型嗅探被设计时,绝大多数奇特的文档要么没有文档类型声明,要么引用了旧的 DTD 。HTML5 承认这一现实,并将文档类型声明定义为 text/html 中的模式切换。

        典型的 pre-HTML5 文档类型声明包含用空格分隔的字符串 ""。HTML5 将 Doctype 简化为 ""。文档类型声明放在文档的根元素开始标记之前。

选择文档类型

text/html

以下是选择新text/html文档的DOCTYPE的简单准则:

  • 标准模式,前沿验证:

    

        这是推荐使用的DOCTYPE。使用这个DOCTYPE可以验证新的特性,例如    和 ARIA。请务必在最新版本的顶级浏览器中测试您的页面。

  • 标准模式,遗留验证目标

        

        这个DOCTYPE也会触发标准模式,但可以让您坚持使用不太精确的遗留验证,而不知道新特性。如果您的组织有愚蠢的政策要求以遗留验证为目标,则可能需要使用这个DOCTYPE。但是,您真的应该使用  并修改您组织的政策。

  • 您希望使用标准模式,但您在表格布局中使用切片图像并且不想修复它们

    

        这会给您带来 "几乎标准" 模式。请注意,如果您以后转向 HTML5(因此也转向完全的标准模式),则基于表格中切片图像的布局很可能中断,因此最好立即使您的设计与标准模式兼容。

  • 您故意想要使用特异模式:

        无DOCTYPE

        请不要这样做。故意为特异模式设计将会在未来困扰您、您的同事或您的继任者。

        如果您对旧版IE版本和仍需支持它们感到沮丧,由于客户端要求,最好使用条件注释针对旧版本应用特定的黑客攻击,而不是寻求特异模式的共性。

我不推荐任何 XHTML 的 DOCTYPE,因为将 XHTML 作为 text/html 提供被认为是有害的。如果您仍然选择使用 XHTML 的 DOCTYPE,请注意 XML 声明会使 IE 6(但不是IE 7!)触发特异模式。

application/xhtml+xml
        对于 application/xhtml+xml 的简单指导方针是完全不使用 DOCTYPE。这样的话,页面就不能 “严格符合” XHTML 1.0 了,但那并不重要。(请参见下面的附录)

IE8、IE9、IE10、和IE11的复杂性

        在 A List Apart 上宣布,IE8 将使用基于 meta 元素的模式切换,而 Doctype 是模式选择的一个因素。(参见伊恩·希克森、大卫·巴伦、大卫·巴伦、罗伯特·奥卡拉汉和马西耶·斯塔霍维亚克的评论)

        IE8 有四种模式:IE 5.5 怪癖模式、IE 7 标准模式、IE 8 几乎标准模式和 IE 8 标准模式。        

        IE9 有七种模式:IE 5.5 怪癖模式、IE 7 标准模式、IE 8 几乎标准模式、IE 8 标准模式、IE 9 几乎标准模式、IE 9 标准模式和 IE 9 XML 模式。

        IE10 有十一种模式:IE 5.5 怪癖模式、IE 7 标准模式、IE 8 几乎标准模式、IE 8 标准模式、IE 9 几乎标准模式、IE 9 标准模式、IE 9 XML 模式、IE 10 怪癖模式、IE 10 几乎标准模式、IE 10 标准模式和 IE 10 XML 模式。

        模式的选取取决于来自各种来源的数据:Doctype、meta 元素、HTTP 头部、从微软定期下载的数据、intranet 区域、用户设置、intranet 管理员设置、如果存在的话,父框架的模式以及用户可切换的UI按钮。(如果嵌入引擎的其他应用程序,该模式还取决于嵌入应用程序)

        幸运的是,如果以下各点都成立,则 IE8 和 IE9 使用文档类型嗅探大致与其他浏览器类似,而 IE10 使用文档类型嗅探完全与其他浏览器相同:

        • 没有作者设置的X-UA-Compatible HTTP 标头

        • 没有作者设置的X-UA-Compatible meta 标签

        • 微软公司没有将该网站的域名列入例外名单中

        • 内网管理员没有将该网站列入例外名单中

        • 用户没有按下兼容性视图按钮,或以其他方式将域添加到用户特定的例外列表中 (Metro IE10 没有这个 UI,但桌面 IE10 的 UI 也会影响 Metro 模式下的行为)

        • 网站不在内网区域

        • 用户没有选择将所有网站显示为 IE7

        • 该页面没有使用 "兼容模式"

        

        除了 X-UA-Compatible 的情况外,IE8 和 IE9 执行文档类型嗅探的方式与 IE7 相同。IE7 仿真被称为兼容性视图。

        在 X-UA-Compatible 的情况下,IE8 和 IE9 的行为与其他浏览器完全不同。有关 IE8 的行为, 请参阅本页的附录或 PDF 和 PNG 格式的流程图。( 其他浏览器的图表为 PDF 格式)还有一个统一的 IE 5.5 到 IE 9(可能包含Chrome 框架)模式 的 PDF 格式图表。

        不幸的是,如果没有 X-UA-Compatible HTTP 标头或 meta 标签,即使使用了适当的 Doctype,IE8 和 IE9 也会让用户将您的页面从他们的最标准模式错误地降级到模拟 IE7 标准模式的 IE7 模式。更糟糕的是,内网管理员可能会这样做。此外,微软公司可能会将您使用的整个域名(例如mit.edu!)列入例外列表。

        为了消除这些影响,仅仅一个 Doctype 是不够的,您需要一个 X-UA-Compatible HTTP 标头或 meta 标签。

        以下是针对在已经触发标准模式或其他浏览器近乎标准模式的文档类型为 text/html 的新文档中,如何选择X-UA-Compatible HTTP 标头或 meta 标签的一些简单指导:

  • 您的网站域名不在微软的例外列表中,你更关心的是不需要包含针对特定浏览器的额外冗余代码,而不是确保用户不能将呈现退回到 IE7 的行为。

        你不必包含X-UA-Compatible HTTP 标头或 meta 标签。

        

  • 您的网站域名在微软的例外列表上,你的网站域名(例如iki.fi!)还有其他作者的网站可能会引起用户为整个域名启用兼容性视图,你关心其他网站对你的网站的帧(在允许帧和被帧不同模式的IE版本中),或者你想确保用户不能启用兼容性视图

        在你的页面上包含以下 meta 元素之一   (在任何脚本元素之前!)或设置以下 HTTP 标头:X-UA-Compatible: IE=Edge

  • 您的网站在 IE7 中工作正常,但在 IE8 或 IE9 中中断

        首先,包含以下 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 框架的复杂性

        谷歌 Chrome 框架是一款针对 IE 6、7、8、9 浏览器的浏览器扩展与插件的结合,它在 IE 浏览器界面上加入了 Google Chrome 的引擎,并使用了 IE 的网络堆栈。安装后,IE 浏览器默认行为正常。然而,网页可以选择调用 Chrome 引擎而不是 IE 引擎,使用 X-UA-Compatible HTTP 标头或 meta 标签。

        在 X-UA-Compatible 中指定 chrome=1,如果 Chrome Frame 已安装,可以在任何支持版本的 IE 中激活 Chrome Frame。指定 chrome=IE6 仅在 IE6 中激活 Chrome Frame,指定 chrome=IE7 仅在 IE7 和 IE6 中激活 Chrome Frame,指定 chrome=IE8 仅在 IE8 及更低版本中激活 Chrome Frame。

        激活 Chrome Frame 的指令可以与控制 IE 引擎的指令(如果 Chrome Frame 未安装)结合使用,用逗号或分号分隔它们:.

        一旦为页面激活了 Chrome Frame,就会选择四种模式(标准、几乎标准、离奇和 XML)中的一种作为 Chrome 的正常模式。

        谷歌 Chrome 框架多年前已停止使用。您不应该尝试适应它。这里提到它只是为了历史的完整性。

相关页面链接

  • Microsoft’s documentation of X-UA-Compatible up to and including IE11
  • Eric Meyer writes about the modes of Mac IE 5 in Use the Right Doctype
  • Mozilla’s DOCTYPE sniffing by David Baron
  • CSS Enhancements in Internet Explorer 6 by Lance Silver discusses the modes and Doctype sniffing in Windows IE 6
  • The Opera 9 DOCTYPE Switches
  • Faruk Ateş writes about IE8 in IE8 and the X-UA-Compatible situation

附录:对XML实现者和规范编写者的呼吁

请不要将文档类型嗅探引入 XML 中。

        文档类型嗅探是标签集合解决方案中的一种标签集合问题。文档类型嗅探是在 HTML 4 和 CSS2 规范编写之后才产生的,它作为一种启发式方法来区分传统文档和作者可能期望符合规范的文档。

        有时有人建议在 XML 方面也使用文档类型嗅探来分派到不同的处理器,以识别正在使用的词汇或激活功能。 这是一个糟糕的主意。 分派和词汇识别应该基于命名空间,而功能激活应该基于显式处理指令或元素。

        引入了整个“良好形成”的概念,以允许无需 DTD 解析 XML,并由此扩展到无需 Doctype 的文档。 正式来说,如果两个 XML 文档具有相同的规范形式并且应用程序以不同的方式对待它们(并且差异不是由于选择不处理外部实体),则应用程序很可能是损坏的。 实际上,如果两个 XML 文档导致相同的内容被报告(忽略 qnames)给 SAX2 ContentHandler 并且应用程序以不同的方式处理文档,则应用程序很可能是损坏的。 考虑到作为 Web 作者,您不能相信解析您的页面的每个人都使用了解析外部实体的 XML 处理器(即使某些浏览器似乎这样做是因为它们将某些公共 ID 映射到缩略 DTD 以进行实体定义),因此向 Web 上的 XML 插入 Doctype 大多是毫无意义的,并且经常出于一种货物崇拜的习惯而这样做。(您仍然可以使用 W3C 验证器的 DTD 覆盖功能来对 DTD 进行验证,尽管 W3C 验证器会说结果只是暂时有效。 或者更好的是,您可以使用 RELAX NG 验证,它不会用模式引用污染文档)仅仅为了嗅探而要求 Doctype 是愚蠢的,即使这是 HTML 在实践中的情况。

        此外,当较低级别的规范定义了两个等效的事物时,较高级别的规范不应试图赋予这两个事物不同的含义。 考虑  。 如果公开标识符被删除,相同的 DTD 仍然被指定,因此  的含义与前面的 Doctype 相同。 是否应该以不同的方式嗅探它们? 这个想法可以进一步延伸。 假设 DTD 被复制到 example.com 并命名为 foobar.dtd:。 如何嗅探呢? 意义是相同的。 整个 DTD 甚至可以粘贴为内联!

        换句话说,如果您有 #include "foo.h",则不应将任何黑魔法绑定到 foo.h 的名称上,因为允许将 foo.h 的内容粘贴为内联或将 foo.h 的内容复制到 bar.h 并说 #include "bar.h" 是可以的。

        我不必对 HTML 和 SGML 做同样的争论,因为 Web 浏览器在解析 HTML 时并不使用真正的 SGML 分析器,因此我认为假装处理 SGML 是没有用的。 但是,如果您还没有被说服,请参阅 W. 埃利奥特·金伯 (W. Eliot Kimber) 关于此事的 comp.text.sgml 帖子(截至 2020 年 1 月被 Google 封锁)。

        注意:IE10 和 IE11 具有用于请求 IE9 行为的处理指令,用于 IE10 和 IE11 或用于 IE10 在 IE11 中的 XML。

附录: text/html 中某些 Doctype 的处理方法

        下表中的 " Quirks Mode "、" Standards Mode " 和 " Almost Standards Mode " 分别用 "Q"、"S" 和 "A" 表示。当浏览器只有两种模式时,如果表格单元格中的行高与 Mozilla 的 " Standards Mode " 相同,则标准模式标记为 "S",如果表格单元格中的行高与 Mozilla 的 " Almost Standards Mode " 相同,则标记为 "A"。

        请注意,使用 XML 内容类型提供的 XHTML 将以 XML 模式呈现。

        本表的目的不是建议表中列出的所有 Doctype 都是新页面的合理选择。本表的目的在于说明我所依据的数据。

        以下缩写符号用于列标题:

  NS6

        Mozilla 0.6…0.9.4 和 Netscape 6.0…6.2.3

  老 Moz

        Mozilla 0.9.5 到 1.1 alpha 和 Mozilla 1.0

  Moz & Safari & Chrome & Edge & Opera 10 & IE10 & IE11 & HTML5

        Mozilla 1.0.1、Mozilla 1.1 beta 及更高版本、Firefox、Netscape 7 及更高版本、Safari 0.9 及更高版本、Opera 10 及更高版本、Chrome、Edge、Konqueror 3.5、IE10、IE11、HTML5 指定的行为(IE10 和 IE11 Quirks 表示可互操作的怪癖模式,而不是 IE 5.5 模式)

  Opera 9.0

        Opera 9.0…9.20

  IE 8, IE 9 和 Opera 9.5

        默认情况下为 IE 8 或 IE 9,没有 X-UA-Compatible override,也没有 Compatibility View override(" A " 表示 IE8 的 Almost Standards 模式和 IE9 的 Almost Standards 模式)以及 Opera 7.5…8.54 和 9.5…9.6

  IE 7 和 Opera 7.10

        启用兼容性视图的 Windows IE7, IE 8,但没有覆盖 X-UA-Compatible (在这种情况下,“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;我还没确认)

Doctype NS6 Old Moz Moz &
Safari &
Chrome &
Edge &
Opera 10
&
IE10
&
IE11
& HTML5
Opera 9.0 IE 8, IE 9 & Opera 9.5 IE 7 & Opera 7.10 IE 6 & Opera 7.0 Mac IE 5 Konq 3.2
None Q Q Q Q Q Q Q Q Q
Q S S S S A A A
Q Q Q Q Q Q Q Q Q
S S S S S A A A A
S S S S S A A Q A
S S S S S A A A A
S S S S S A A A A
Q Q Q Q Q Q Q Q Q
Q Q Q Q Q Q Q Q Q
S S A A A A A A Q
Q S A A A A A A Q
Q Q Q Q A A A A Q
S S S S S A A A A
S S S S S A A A A
S S S S S A A A A
S S A A A A A A Q
S S S S S A Q A Q
S S S S S A Q A Q
S S S S S A Q A Q
S S A A A A Q A Q
Q S S Q Q Q Q Q Q
Q S S S S A A A Q
S S S Q Q Q Q Q Q
S S S S S A A A Q

历史注释

        Mozilla 的文档类型嗅探代码在 2000 年 10 月、2001 年 9 月和 2002 年 6 月发生了实质性的变化。本文描述了在 2000 年 10 月 19 日及之后从 ftp.mozilla.org 上提供的 Mozilla build(以及与 Netscape 6.x 一起提供的)的情况。本文不涉及 Mozilla M18(以及 Netscape 6.0 PR3)中文档类型嗅探的工作方式。Safari 的文档类型嗅探代码自第一个公开测试版以来也发生了实质性的变化。本文不包括早于 v73(即 0.9)的版本的行为。

        Konqueror 的文档类型嗅探代码在版本 3.5 之前似乎来自 Safari 的很早版本。Konqueror 现在匹配文档类型嗅探来自 Mozilla 的 Safari。

        从表中可以看出,Opera 的文档类型嗅探逐渐从类似于 IE 的方式转变为类似于 Mozilla 的方式,尽管 Opera 9.5 和 9.6 在这个过程中出现了倒退。与此同时,Opera 怪癖模式的布局行为已从模仿 IE 6 的 怪癖模式转变为 Mozilla 的 怪癖模式。

附录:IE8 模式选择

开始: 转到“ X-UA-Compatible meta?”

  X-UA-Compatible meta?

        IE=7: 使用 IE7 标准

        IE=EmulateIE7: 转到 "怪异或无 Doctype?(兼容模式)"

        IE=IE8 或 IE=IE7 或 IE=a 或 IE=EmulateIE8 或不存在或先有脚本: 转到 " X-UA-Compatible HTTP 标头?"

        IE=8 或 IE=Edge 或 IE=99 或 IE=9.9: 转到 "几乎标准文档类型?"

        IE=5: 使用 Quirks (IE 5.5)

  X-UA-Compatible HTTP 标头?

        IE=7: 使用 IE7 标准

        IE=EmulateIE7: 转到 "怪异或无 Doctype?(兼容模式)"

        IE=IE8 或 IE=IE7 或 IE=a 或 IE=EmulateIE8 或不存在或先有脚本: 转到 "显示所有网站…预设设置?"

        IE=8 或 IE=Edge 或 IE=99 或 IE=9.9: 转到 "几乎标准文档类型?"

        IE=5: 使用怪异模式(IE 5.5)

  怪异或无 Doctype ?(兼容模式)

        是: 使用怪异模式(IE 5.5)

        否: 使用 IE7 标准

  显示所有网站…预设设置?

        是: 转到 "怪异或无 Doctype?(兼容模式)"

        否: 转到 "显示内网网站…预设设置?"

  显示内网网站…预设设置?

        是: 转到 "网站是否在内网区域内?"

        否: 转到 "域名是否在 MS 维护列表中?"

  网站是否在内网区域内?

        是: 转到 "怪异或无 Doctype?(兼容模式)"

        否: 转到 "域名是否在 MS 维护列表中?"

  域名是否在 MS 维护列表中?

        是: 转到 "怪异或无 Doctype?(兼容模式)"

        否: 转到 "是否由兼容模式页面框架?"

  是否由兼容模式页面框架?

        是: 转到 "怪异或无 Doctype?(兼容模式)"

        否: 转到 "兼容模式按钮是否按下?"

  兼容模式按钮是否按下?

        是: 转到 "怪异或无 Doctype?(兼容模式)"

        否: 转到 "怪异或无 Doctype?(IE8)"

  怪异或无 Doctype?(IE8)

        是: 使用怪异模式(IE 5.5)

        否: 转到 “几乎标准文档类型?”

  几乎标准文档类型?

        是: 使用 IE8 的几乎标准

        否: 使用 IE8 标准

       

这些步骤以 PDF 和 PNG 格式的流程图形式提供。

致谢

        感谢 Simon Pieters, Lachlan Hunt 和 Anne van Kesteren 的帮助,纠正了各种 Opera 版本的模式表和他们的评论。感谢 Simon Pieters 为 IE8 流程图提供文本替代方案。


Copyright Henri Sivonen

First version written in November 2000. Text last notably updated: 2020-01-06; typo fixed 2021-02-07

Main page

你可能感兴趣的:(前端,前端,html5,chrome)