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

Posted

技术标签:

【中文标题】JavaScript:如果它处于 IE7 或 IE8 兼容模式,我可以检测到 IE9 吗?【英文标题】:JavaScript: Can I detect IE9 if it's in IE7 or IE8 compatibility mode? 【发布时间】:2011-08-15 02:04:31 【问题描述】:

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

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

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

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


已编辑添加…

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

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

因此,页面、非开发人员用户、元标记或 Microsoft 的兼容性列表都无法将 IE9 置于这种无法识别的状态。

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

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

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

【问题讨论】:

永远不要相信用户代理...它可以完美地撒谎,并且无法确定它是否说真话...您应该测试特定的功能或特性 @JCOC611 是和否。这是一个具体的问题,如何在兼容性视图中找出是否是IE9,这是一个合理的问题。一般来说,不应该依赖用户代理字符串来实现网站功能,因为很容易伪造它,真的。 即使用户代理是准确的,如果可能的话,最好还是使用特征检测。那么,你一开始就不需要知道 IE 是否处于兼容模式。 我只想补充一点,如果您想为使用错误浏览器模式的用户提供快速教程,这非常有用。 @JCOC611 谁会欺骗他们的用户代理并期望事情正常工作 - 我们真的应该关心这种情况吗? 【参考方案1】:

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

Introducing IE9’s User Agent String:

类似于 IE8,IE9 的兼容性 视图将映射到 IE7 标准模式, 和 IE9 的 UA 字符串 兼容性视图将是:

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

在兼容性视图中,IE9 报告 通过应用程序本身作为 IE7 版本号 (Mozilla/4.0) 和 版本令牌(MSIE 7.0)。这个做完了 为了兼容性。 递增 三叉戟代币,从‘Trident/4.0’到 “Trident/5.0”,允许网站 区分IE9运行在 Compat View 和 IE8 在 Compat 中运行 查看

(强调由我添加)。因此,用户代理字符串与它报告自己为“Mozilla/4.0”和 MSIE 7.0 相同,但 IE9 将始终为 Trident/5.0 - 无论它显示的是 MSIE 7.0、MSIE 8.0 还是 MSIE 9.0。

其实你应该看看这个很棒的汇编:Browser ID (User-Agent) Strings 或者更好的useragentstrings.com

【讨论】:

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

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,但应该是一样的。 刚刚在 IE10 中用边缘 META 标签试过这个;通常,它返回“10”。对所有站点强制打开兼容模式,它仍然返回“10”。 在 IE10 和 IE11 预览版中为我工作【参考方案3】:

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)

【讨论】:

太好了,IE10 也增加 Trident 吗? Internet explorer 10 用户 Trident/6.0....见blogs.msdn.com/b/ie/archive/2012/07/12/… 而IE11使用Trident/7.0【参考方案4】:

这是table of all Browser and Document modes for IE9:

【讨论】:

您是否有机会获得包含 IE10 和 IE11 的更新版本?【参考方案5】:

我希望 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]>

【讨论】:

谢谢 Dr.Molle,我会试一试并报告。 不幸的是,这只适用于浏览器模式(IE9 开发人员工具中的左侧下拉菜单)。它不适用于文档模式(右侧下拉菜单)。对于文档模式,它仅适用于 IE9 文档模式。如果它处于 IE8、IE7 或 Quirks 模式,则该逻辑失败。 该死,你的权利。我找到了另一个属性,在每种模式下都适用于我:window.performance @Dee2000:它也适用于 DocumentMode。 IE。仅当 DocumentMode = "Internet Explorer 9 standard" 时,此测试才会成功。 @Dr.Molle 谢谢你,window.performance 做得很好。【参考方案6】:

有时需要从服务器变量中读取用户代理字符串,而不是从 javascript navigator 对象中读取。

比较差异:

ASP 经典,IE11

客户端 javascript,navigator.userAgent:“Mozilla/5.0(兼容;MSIE 9.0;Windows NT 6.1;WOW64;Trident/7.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5。 30729;.NET CLR 3.0.30729;媒体中心 PC 6.0;.NET4.0C;.NET4.0E;BOIE9;ENUS)"

服务器 ASP, Request.ServerVariables("HTTP_USER_AGENT"): "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; BOIE9;ENUS; rv:11.0) 像 Gecko "

ASP 经典,IE11 兼容模式

客户端 javascript,navigator.userAgent:“Mozilla/5.0(兼容;MSIE 9.0;Windows NT 6.1;WOW64;Trident/7.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5。 30729;.NET CLR 3.0.30729;媒体中心 PC 6.0;.NET4.0C;.NET4.0E;BOIE9;ENUS))"

服务器 ASP,Request.ServerVariables("HTTP_USER_AGENT"): "Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.1;WOW64;Trident/7.0;SLCC2;.NET CLR 2.0.50727; .NET CLR 3.5.30729;.NET CLR 3.0.30729;媒体中心 PC 6.0;.NET4.0C;.NET4.0E;BOIE9;ENUS)"

【讨论】:

【参考方案7】:

来自https://***.com/a/29288153/2879498

假设您有一个 ID 为 compat-warning 的隐藏元素:

带有 jQ​​uery 的 Javascript:

$(function()
    function showCompatWarning() 
        $('#compat-warning')
            .css('display','block')
            .css('height','auto')
            .show();
    
    var tridentOffset = navigator.appVersion.indexOf('Trident/');
    if ( tridentOffset === -1 ) return;
    var jscriptVersion = 0;
    /*@cc_on @*/
    /*@if (@_jscript) jscriptVersion = @_jscript_version ; @*/;
    /*@end @*/
    var tridentVersion = parseInt(navigator.appVersion.substr(tridentOffset+8),10);
    var guessIEVersion = tridentVersion + 4;
    if (( document.documentMode && jscriptVersion && jscriptVersion < 10 && jscriptVersion !== document.documentMode ) ||
        ( document.compatMode && document.compatMode === 'BackCompat') ||
        ( document.documentMode && document.documentMode < 10 && document.documentMode != guessIEVersion ))
        showCompatWarning();
);

检测和警告,您抵御兼容性地狱的第一道和最后一道防线。

【讨论】:

以上是关于JavaScript:如果它处于 IE7 或 IE8 兼容模式,我可以检测到 IE9 吗?的主要内容,如果未能解决你的问题,请参考以下文章

您对在您的页面中包含 ie7.js 或 ie8.js 感觉如何?

IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理

IE7 和 CSS 表格单元格属性

如何制作一个能够很好地处理IE7的现代网站?

jQuery 旋转 - IE7 或 IE8 问题

JavaScript 用JavaScript检测IE7