27

可能重复:
区分IE7浏览器和IE7兼容模式下的浏览器

我们还没有时间用我们相当广泛的系统全面测试 IE8。我们也达到了不能禁止使用 IE8 的程度。我们的用户很固执,也不是很老练,所以我们觉得我们不能告诉他们使用“兼容模式”按钮。相反,我们将添加“IE=EmulateIE7”元标记作为临时修复。

问题是当使用这个标签时,浏览器仍然报告自己是IE8,然后被我们的页面检测到并被拒绝。我可以理解为什么服务器端检测无法获取元标记(在发送和处理元标记之前,服务器已经拥有用户代理),但客户端检查也失败了。如果在客户端计算机上单击兼容模式按钮,则用户代理是 IE7,但如果我们使用元标记,则不是。

这意味着,除其他外,我们必须禁用检查,然后,如果我们在某处犯了错误而忘记将元标记添加到页面,我们将有损坏的页面。

有没有其他人遇到过这种情况并提出更好的方法?当模式由元标记设置时,是否无法检测到 IE8 正在以兼容模式运行?

而且,我们确实知道有一个有效的思想流派,我们应该让所有页面与 IE8 标准模式兼容,但在我们现实的小角落里,这现在不是一个可行的选择(我会指出我们没有创建必须以非标准方式编写的 4 或 5 个版本的 IE)。

4

5 回答 5

24

IE8 在 User-Agent 字符串中包含一个 trident 令牌,无论兼容模式如何。

有关详细信息,请参阅 MSDN:http: //blogs.msdn.com/ie/archive/2009/01/09/the-internet-explorer-8-user-agent-string-updated-edition.aspx


Windows Vista Mozilla/4.0上的 IE7 (兼容; MSIE 7.0;Windows NT 6.0)

Windows Vista 上的 IE8(兼容性视图)
Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.0;Trident/4.0


Windows Vista Mozilla/4.0上的 IE8 (兼容; MSIE 8.0;Windows NT 6.0;Trident/4.0

于 2009-08-31T06:49:30.323 回答
12

您需要检查 document.documentMode 的值,该值在真正的 IE8 模式下为 8,在 IE7 模式下为 7。用户代理字符串在这两种情况下都是相同的,并且仍然是 IE8。请注意,此 JavaScript 变量仅在 IE8 中可用。

于 2009-08-25T15:46:40.643 回答
5

仅供参考,有关如何检测兼容模式(AKA 如何检测兼容性视图)的详细信息,请考虑查看以下链接...

http://msdn.microsoft.com/en-us/library/cc288325(VS.85).aspx

...这显示了一些有用的信息。

于 2010-01-08T17:05:27.847 回答
2

当您处理从 IE8 仿真 BLACKLIST 网站(如 Facebook)进入您的网站的链接时,问题实际上更加复杂。

Facebook 上的共享链接会导致您的链接在弹出窗口中打开 - 如果在默认情况下选中的兼容性视图设置中选中“包括更新网站列表”,则弹出窗口会看到来自 Facebook 的黑名单引荐来源并在黑名单中打开窗口模式最初。在后台检测 Trident\4.0 - 您将看到该值,并设置下级 CSS。

但是,在浏览器加载后,它会退出 Compat 模式并更改为 STANDARD 模式而无需刷新。因此,您为分配的标准模式分配了错误的 CSS。

解决方案 - 强制 IE 浏览器退出兼容模式。是的 - 看起来很奇怪,如果您不需要,为什么要让用户在您的网站上降级。

就像 Downlevel 一样,您设置 IE=EmulateI7 来强制关闭浏览器,您可以添加 IE=EmulateIE8 并强制用户在 IE8 标准中查看您的页面。这种模式甚至消除了他们选择兼容性视图并减少该模式的测试需求的能力

于 2009-10-23T20:34:31.173 回答
1

不完全是“检测 IE8 兼容模式”,但它可能也有帮助:

如果您有权访问服务器本身,则可以发送一个 HTTP 标头,请查看Mike Ormond 的博客用于在 IIS 上实现元开关的 MSDN 页面包含标头的详细信息以及如何设置/发送它。

于 2009-08-25T15:21:32.927 回答