JavaScript:是否可以在IE7或IE8兼容模式下检测IE9?


87

我需要知道通过用户代理字符串标识为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。

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

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

不用担心,这不适用于样式,格式,逻辑或页面内容。我对那些东西使用特征检测。我只需要检测IE9(无论它处于哪种模式),然后就此做出非页面内容决定即可。

感谢您引导我提出您的建议和链接,以解答您的问题。


1
永远不要相信用户代理...它完全可以说谎,无法确定它是否在说真话...您应该测试特定的功能或特性
JCOC611

2
@ JCOC611是和否。这是一个特定的问题,如何在兼容性视图中查找是否为IE9,这是一个合理的问题。通常,不应依赖用户代理字符串来实现站点功能,因为很容易伪造它,这是事实。
丹尼斯·G

1
即使用户代理是准确的,也尽可能使用特征检测。然后,您无需首先了解IE是否处于兼容模式。
戴夫·沃德

1
我只想补充一点,如果您想为使用错误浏览器模式的用户提供快速教程,这将非常有用。
Joost

1
@ JCOC611谁会欺骗他们的用户代理并期望一切正常运行-我们真的应该关心这种情况吗?
JohnnyFaldo 2014年

Answers:


67

实际上,以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 / 4.0'到'Trident / 5.0'的增量Trident令牌可以使网站区分在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


1
嗨,moontear。我还看到当IE9处于IE7模式时应该会出现“ Trident / 5.0”,但这不是我在Win7 Pro x64上的(最终)IE9上看到的。它在IE7模式下根本没有显示三叉戟(这就是真正的IE7的样子),而在IE8模式下却显示了三叉戟4(同样,真正的IE8的样子)。我正在使用IE9开发人员工具的第一个下拉列表来选择浏览器模式,然后在地址栏中提醒javascript:alert(navigator.userAgent)
Dee2000 2011年

1
在所有模式下,IE9的用户代理字符串中都存在“ Trident / 5.0”。
EricLaw

正如EricLaw所说,Dee。使用兼容模式时必须存在Trident / 5.0(浏览器模式可能会有所不同吗?)。您如何检查用户代理字符串?尝试通过whatsmyuseragent.com检查并进行报告。
丹尼斯·G

请在下面查看我的回复(我必须使用另一个id Dee2001,因为关于将回复添加到您自己的消息的堆栈溢出8小时规则)。是的Eric和Moontear都正确,在所有IE9的模式下存在Trident / 5.0 。我的大错误是在开发人员工具中将“浏览器模式”更改为IE7或IE8,但这不是页面/元标记/兼容性列表可以强制执行的“模式”。取而代之的是,它实际上是在模拟浏览器本身,因此useragent字符串自然很像IE7 / 8。
Dee2000

1
太棒了!非常感谢。我没有根据报告的浏览器进行样式设置,但是我正在工作的网站顶部设置了一个警告栏,提示用户需要升级(如果条件标签说它小于或等于ie7) -在这种情况下,我不希望消息说升级,而是禁用兼容模式
切尔西·厄克特

47

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


17
请扩大答案。更多上下文。
random_user_name 2012年

3
人们为什么不加上它,这正是它所需要的东西
Jamie Hutber

5
这确实是最好的方法。您可以通过以下方式使用它:<script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>。真正的(!)IE7和所有非IE返回“未定义”,仅Comp中的IE8 / 9。模式返回7.我无法测试IE10,但是应该相同。
Frank Conijn

2
刚刚在IE10中使用带有边缘META标签的一侧进行了尝试;通常,它返回“ 10”。对所有站点强制启用兼容模式,它仍然返回“ 10”。
Wholkaholism,

在IE10和IE11 Preview中为我工作
Simon Keep

20

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)

1
太好了,IE10也会增加Trident吗?
slotishtype 2012年

3
Internet Explorer的10个用户三叉戟/ 6.0 ....看到blogs.msdn.com/b/ie/archive/2012/07/12/...
slotishtype

1
和IE11使用Trident / 7.0
Dee2000


11

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

1
感谢Molle博士,我将尝试尝试并进行报告。
Dee2000 2011年

不幸的是,这仅适用于浏览器模式(IE9开发人员工具中的左侧下拉菜单)。它不适用于“文档”模式(右侧的下拉菜单)。对于文档模式,它仅在IE9文档模式下有效。如果它处于IE8,IE7或Quirks模式,则该逻辑将失败。
Dee2000 2011年

7
该死,你的权利。我发现了另一个属性,可以在每种模式下使用:window.performance
Dr.Molle

@ Dee2000:它也适用于DocumentMode。即仅当DocumentMode =“ Internet Explorer 9 standard”时此测试才能成功。
NiklasBäckman2012年

@ Dr.Molle对此表示感谢,window.performance很好地完成了这项工作。
lewsid 2012年

3

有时有必要从服务器变量而不是从javascript导航器对象读取用户代理字符串。

比较差异:

  • 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; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)

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

  • 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; Media Center 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; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)


0

https://stackoverflow.com/a/29288153/2879498

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

带有jQuery的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();
});

检测和警告,是您兼容性的第一道和最后一道防线。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.