如何判断浏览器是不是处于“怪癖”模式?

Posted

技术标签:

【中文标题】如何判断浏览器是不是处于“怪癖”模式?【英文标题】:How to tell if a browser is in "quirks" mode?如何判断浏览器是否处于“怪癖”模式? 【发布时间】:2010-10-12 05:50:03 【问题描述】:

假设您的页面具有相对严格的 doctype 和 html 标记,非常接近合规性,但可能会以一些愚蠢的方式遗漏,可能是因为您无法控制的用户内容...假设您正在工作在内容管理系统或内容管理系统的主题上,您可以控制一些基本结构并需要一些 javascript,但您不对页面中的其他所有内容负责。

当浏览器决定进入“怪癖”模式而不是使用更符合标准的引擎时,您如何判断(或:什么会决定)?

我正在寻找每个主要浏览器的答案,因为 IE、Chrome、Safari 和 Firefox 当然都会以不同的方式处理这些问题。一个错误是否足以强迫它,还是你有一些余地?

【问题讨论】:

【参考方案1】:

Firefox 和 Opera 中,您可以通过检查页面信息来确定您的浏览器是否处于“怪癖模式”。

使用document.compatMode,将告诉您您在大多数浏览器中所处的模式。

Chrome、Safari 和 IE 中,在地址栏中运行此 javascript:

 javascript:window.alert('You are in ' + (document.compatMode==='CSS1Compat'?'Standards':'Quirks') + ' mode.')

(请注意,由于最近的安全更改,您需要在粘贴到地址栏后重新输入javascript: 部分)

【讨论】:

在 IE 中还有另一个潜在价值,我在强制旧页面进入“EDGE”模式时遇到了这种价值。值为“BackCompat” 在将 DOCTYPE 设置为完全无效的内容时,我在 Chrome 中也获得了 BackCompat。根据此答案中的代码,如果该值不是 CSS1Compat,则它处于 quirks 模式。这是真的吗?所有可能的值是多少? 显然 BackCompatible 是“怪癖”/“兼容性”模式的标准值。只有 2 个值:developer.mozilla.org/en-US/docs/Web/API/Document/compatMode 访问 Firefox 的“页面信息”比以前更难了。 easiest way now is Ctrl+I.【参考方案2】:

由于您可以在 JavaScript 中查询渲染模式,因此您可以拥有一个 Bookmarklet,它会告诉您页面正在使用哪种渲染模式。

我发现this render mode bookmarklet 对我很有效:

javascript:m=(document.compatMode=='CSS1Compat')?'Standards':'Quirks';window.alert('You%20are%20in%20'%20+%20m%20+%20'%20mode.');

【讨论】:

【参考方案3】:

您的实际具体问题的完整答案是“一个错误是否足以迫使它发生,还是您有一些回旋余地?”是它完全取决于错误。例如,

<!-- Comment -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

将在 IE 6 和 7 中强制使用 quirks 模式,尽管这并不是真正的错误(当文件的第一行不是声明时,它们只会抛出一个完全不稳定的问题)。 可以找到类型/怪癖的快速列表here

尝试在您的 HTML 中粘贴以下行进行测试(非常糟糕的 javascript 行为我在这里传递 - 抱歉...确保这永远不会上线 :)

<a href="javascript:alert(document.compatMode);">What mode am I?</a>

【讨论】:

感谢 javascript 测试人员,因为我的前两次尝试逃避怪癖模式都没有成功。 css1compat != 怪癖模式?【参考方案4】:

根据http://www.quirksmode.org/css/quirksmode.html : “问题是某些以 quirks 模式编写的页面确实有 doctypes。因此,每个浏览器都有自己的列表,其中包含触发 quirks 模式的 doctypes。有关这些列表的概述,请参阅此浏览器比较图表:http://hsivonen.iki.fi/doctype/”

希望对你有帮助

【讨论】:

【参考方案5】:

如果你告诉 IE 它应该是严格的(通过 doctype)它不会在页面中途改变主意。

【讨论】:

【参考方案6】:

如果我正确理解了 quirks 模式,那么一个没有根据其声明的 doctype 进行验证的页面不足以触发 quirks 模式。它只是无法正确显示。

我找到的用于确定不同浏览器如何处理每种文档类型的最佳资源是here。

【讨论】:

【参考方案7】:

对于添加了 Web Developer Toolbar 的 Firefox,您可以查看工具栏右侧的三个图标。最左边的告诉你你在什么模式。

【讨论】:

【参考方案8】:

在 IE 中,您将在开发人员工具中看到它(按 F12),它在菜单中显示:文档模式:... 你也可以在那里强制使用不同的模式。

【讨论】:

这没有抓住问题的关键。这并不能帮助您编写 javascript 来执行怪癖模式的一条路径和标准模式的不同路径。 其实你问的不是Javascript怎么做,而是怎么知道浏览器使用什么模式。无论如何,即使您不是故意的,它也可以帮助其他寻找它的人,我自己需要知道如何在 Firefox 中了解它并解决了这个问题。 @JoelCoehoorn 实际的问题是您从未解释过“相对严格的文档类型”是什么!【参考方案9】:

在html5页面中,写“&lt;!DOCTYPE html&gt;”开头的页面可以改成 document.compatMode='CSS1Compat'

【讨论】:

以上是关于如何判断浏览器是不是处于“怪癖”模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何判断浏览器/选项卡是不是处于活动状态[重复]

如何在浏览器 JavaScript 中检测 OS X 是不是处于暗模式? [复制]

在 Chrome、Firefox 和 Safari 中强制标准/怪癖模式?

如何判断用户是不是处于IOS UIAccessibility的开关控制模式

检测浏览器是不是处于全屏模式

如何判断一个元素是不是在可视区域内