JavaScript:如果 IE9 处于 IE7 或 IE8 兼容模式,我可以检测到它吗?

IT技术 javascript internet-explorer-9 ie8-compatibility-mode
2021-02-06 15:46:37

我需要知道通过用户代理字符串将自己标识为 IE7 或 IE8 的浏览器是否真的是那些浏览器,或者它是否是 7 或 8 兼容模式下的 IE9。

从我在用户代理字符串中可以看到,IE7 兼容模式下的 IE9 提供与真实 IE7 相同的字符串。是否有额外的属性/元素/对象可以测试以查看它是否“真的”是伪装的 IE9?

我认为文档模式无济于事,因为我的脚本加载到的页面可能会强制怪癖或强制特定设置。

我希望 IE9 将具有一些存在且可测试的属性,无论它是否处于 7、8 或 9 模式。


编辑添加…

好的,我现在知道我哪里出错了。我正在使用“浏览器模式”下拉菜单并将其切换到 IE8 和 IE7,并认为这分别是“IE8 兼容模式”和“IE7 兼容模式”。这当然不是真的。开发人员工具的浏览器模式确实将其切换为“像”那些旧浏览器,因此报告原始用户代理字符串是正确的。

如果我将浏览器模式保留在 IE9 或 IE9 兼容性中并尝试使用文档模式下拉变体,那么我实际上会在所有 8 种组合(两种浏览器模式和 4 种文档模式)中都出现“Trident/5.0”。我只需要避开选择浏览器模式 IE7 和 IE8,因为它们确实是(模拟的)IE7 和 IE8。

因此,页面、非开发者用户、元标记或微软的兼容性列表不可能将 IE9 置于这种无法识别的状态。

只要使用if(navigator.userAgent.indexOf("Trident/5")>-1)就足够了。

别担心,这不适用于样式、格式、逻辑或页面内容。我对这些事情使用特征检测。我只需要检测 IE9(不管它处于什么模式)并对此做出非页面内容决定。

感谢您通过您的建议和链接引导我找到答案。

6个回答

实际上在IE7兼容模式下IE9的用户代理字符串是不同的,所以这将是区分不同IE版本的最好方法之一。

介绍 IE9 的用户代理字符串

与 IE8 类似,IE9 的兼容性视图将映射到 IE7 标准模式,并且在兼容性视图中 IE9 的 UA 字符串将是:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)

在兼容性视图中,IE9 通过应用程序版本号 (Mozilla/4.0) 和版本令牌 (MSIE 7.0) 将自身报告为 IE7。这样做是为了兼容性。递增的 Trident 令牌,从“Trident/4.0”到“Trident/5.0”,允许网站区分在 Compat View 中运行的 IE9 和在 Compat View 中运行的 IE8

(重点是我加的)。所以用户代理字符串与它报告自己是“Mozilla/4.0”和 MSIE 7.0 是一样的,但 IE9 将始终是 Trident/5.0 - 无论它是说 MSIE 7.0、MSIE 8.0 还是 MSIE 9.0。

实际上你应该看看这个很棒的汇编:浏览器 ID(用户代理)字符串或者更好的useragentstrings.com

正如 EricLaw 所说,Dee。使用兼容模式时必须存在 Trident/5.0(浏览器模式可能不同?)。你如何检查用户代理字符串?尝试通过whatsmyuseragent.com检查并报告。
2021-03-17 15:46:37
请参阅下面的回复(我不得不使用另一个 ID Dee2001,因为关于向您自己的消息添加回复的堆栈溢出 8 小时规则)。是Eric和Moontear都是正确的,三叉戟/ 5.0存在于所有的IE9的模式。我的大错误是在开发人员工具中将“浏览器模式”更改为 IE7 或 IE8,但这不是页面/元标记/兼容性列表可以强制执行的“模式”。相反,它实际上是在模拟浏览器本身,因此用户代理字符串自然就像 IE7/8 一样。
2021-03-23 15:46:37
“Trident/5.0”在所有模式下都出现在 IE9 的用户代理字符串中。
2021-03-29 15:46:37
太棒了!非常感谢。我不根据报告的浏览器设置样式,但我在我正在处理的站点顶部设置了一个警告栏,表示用户需要升级(如果条件标签表示它小于或等于 ie7) -- 在这种情况下,我不希望消息说升级而是禁用兼容模式
2021-03-31 15:46:37
嗨月泪。我还看到当 IE9 处于 IE7 模式时应该出现“Trident/5.0”,但这不是我在 Win7 Pro x64 上的(最终)IE9 上看到的。它在 IE7 模式下根本没有显示三叉戟(这就是真正的 IE7 的样子),它在 IE8 模式下显示了三叉戟 4(同样,真正的 IE8 是什么样子)。我使用 IE9 开发人员工具首先下拉选择浏览器模式,然后在地址栏中提醒 javascript:alert(navigator.userAgent)
2021-04-02 15:46:37

document.documentMode 是文档模式的最佳方式。

这确实是最好的方法。您可以使用这种方式:<script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>真正的(!)IE7 和所有非 IE 都返回“未定义”,只有 Comp 中的 IE8/9。mode return 7.我无法测试IE10,但应该是一样的。
2021-03-17 15:46:37
请稍微扩展一下答案。更多上下文。
2021-03-23 15:46:37
在 IE10 和 IE11 预览版中对我有用
2021-03-29 15:46:37
为什么人们不加这个,它正是需要的
2021-03-31 15:46:37
刚刚在带有边缘 META 标签的 IE10 中尝试了这个;通常,它返回“10”。强制所有站点的兼容模式,它仍然返回“10”。
2021-04-11 15:46:37

IE7 不包含任何关于 Trident 的信息

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)

IE8 包含此字符串:“Trident/4.0”

User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)

IE9 包含此字符串:“Trident/5.0”

兼容模式下的IE9:

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)

正常模式下的IE9:

User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)
Internet Explorer 10 用户 Trident/6.0....参见blogs.msdn.com/b/ie/archive/2012/07/12 /...
2021-03-16 15:46:37
太好了,IE10 也会增加 Trident 吗?
2021-03-29 15:46:37
和 IE11 使用 Trident/7.0
2021-04-13 15:46:37
你有没有机会更新一个包含 IE10 和 IE11 的?
2021-03-16 15:46:37

我希望 IE9 将具有一些存在且可测试的属性,无论它是否处于 7、8 或 9 模式。

检查例如style.opacity,它是在 IE9 中引入的,无论兼容模式如何都可用:

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>
@Dee2000:它也适用于我的 DocumentMode。即,仅当 DocumentMode = "Internet Explorer 9 标准" 时,此测试才会成功。
2021-03-20 15:46:37
@Dr.Molle 对此表示感谢,window.performance 做得很好。
2021-03-20 15:46:37
不幸的是,这只适用于浏览器模式(IE9 开发人员工具中的左侧下拉菜单)。它不适用于文档模式(右侧下拉菜单)。对于文档模式,它仅适用于 IE9 文档模式。如果它处于 IE8、IE7 或 Quirks 模式,则该逻辑失败。
2021-04-05 15:46:37
谢谢 Molle 博士,我会尝试一下并报告。
2021-04-06 15:46:37
该死,你的权利。我找到了另一个属性,适用于所有模式:window.performance
2021-04-12 15:46:37