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

时间:2011-04-28 21:40:49

标签: javascript internet-explorer-9 ie8-compatibility-mode

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

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

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

我希望IE9会有一些存在的属性,无论是在7,8或9模式下都可以测试。


已编辑添加...

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

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

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

只需使用if(navigator.userAgent.indexOf("Trident/5")>-1)即可。

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

感谢您根据自己的建议和链接指导我。

7 个答案:

答案 0 :(得分:67)

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

Introducing IE9’s User Agent String

  

类似于IE8,IE9的兼容性   View将映射到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中运行的Compat View和IE8   图

(我强调)。因此,用户代理字符串与报告自身为“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

答案 1 :(得分:47)

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

答案 2 :(得分: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)

答案 3 :(得分:17)

答案 4 :(得分: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]>

答案 5 :(得分: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”):“ Mozilla / 5.0(Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv:11.0),如Gecko

  • ASP classic, 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)

答案 6 :(得分:0)

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

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

Javascript w / jQuery:

$(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();
});

检测和警告,你对兼容地狱的第一道防线和最后一道防线。