区分IE7浏览器和IE7兼容模式下的浏览器

IT技术 javascript internet-explorer compatibility browser-detection
2021-02-16 01:53:56

我可以在 IE7 兼容模式下区分客户端的浏览器是 IE7 还是 IE9 吗?我想弄清楚我是否可以在我的网站上做一个 JS 检查,它会识别两种不同的东西并根据结果做不同的事情

  1. 那个浏览器是IE7
  2. 该浏览器处于 IE7 兼容模式

我有第一个条件正常工作,因为几乎到处都在说如何做到这一点。不确定第二个和/或两者的组合。

5个回答

至少对于 IE8 和 IE9,您可以检查其中是否navigator.userAgent包含子字符串TridentIE8+的用户代理中总是有一个Trident,而 IE7 没有。请参阅此答案其中的 MSDN 链接

IE10 似乎更棘手:在下面的评论中报告说,IE7 仿真模式Trident并不总是存在。如果 IE10 在 IE7 可用的任何平台上不可用,操作系统字符串(例如Windows NT 6.2)可能仍会显示 IE10。

另请注意,HTTPUser-Agent标头可能并不总是匹配navigator.userAgent至少在启用了兼容模式(发送 IE7User-Agent标头)但IE=Edge在响应中检测到类似内容的IE9 是这种情况navigator.userAgent返回到 IE9)。

这是 IE7 模式下 Windows 8 上 IE10 的 ua 字符串:"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Tablet PC 2.0)". 如您所见,建议 IE8+始终具有 Trident 子字符串是错误的提供的源比现代 IE 浏览器早 2 年多。2009 年适用于 Internet Explorer 8 的内容不一定适用于此后的所有 IE 实例。
2021-04-23 01:53:56
@tuomassalo 您在什么设备上运行 Windows 8?请注意,IE8+“总是”包含对 Trident 的引用不正确的
2021-04-23 01:53:56
正是 :) 如果浏览器在用户代理中有“Trident”和“MSIE 7.0”,它很可能是兼容模式下的 ie>7。没有“三叉戟”,但“MSIE 7.0”意味着很可能是真正的 IE7。
2021-04-24 01:53:56
刚刚试过了,这有效,这应该是公认的答案
2021-04-24 01:53:56
@JonathanSampson:奇怪。我的 Win8 测试机在 IE7 模式下给出了这个:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/6.0; .NET4.0E; .NET4.0C). 也许非三叉戟 UA 字符串与这个Tablet PC 2.0东西有关?叹。
2021-05-09 01:53:56

我不相信有一种方法可以检测用户的浏览器是否处于兼容模式。他们的用户代理字符串将由他们的浏览器模式决定,他们的文档模式将由x-ua-compatible元标记(或标题)的存在或可能由使用的文档类型决定。

兼容模式旨在保护现代浏览器用户免受依赖于旧的和过时的功能或黑客的页面的影响。这不是你真正想要测试的东西。相反,编写符合标准的代码,浏览器可以在兼容模式或非兼容模式下理解这些代码。

以下是不同浏览器模式和文档模式的各种结果:

浏览器模式:IE10 兼容视图/文档模式:IE7 标准

navigator.userAgent
 
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/6.0; 
.NET4.0E; .NET4.0C; Media Center PC 6.0; .NET CLR 3.5.30729; 
.NET CLR 2.0.50727; .NET CLR 3.0.30729; BRI/2)" 

document.documentMode

7

浏览器模式:IE7 / 文档模式:IE7 标准

navigator.userAgent

"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; .NET4.0E; 
.NET4.0C; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 2.0.50727; 
.NET CLR 3.0.30729; BRI/2)"

document.documentMode

7

如您所见,通过这两种方法无法判断用户是否处于兼容视图中。

覆盖兼容视图列表

如果您的站点出现在兼容性视图列表中,您可以通过提供您自己的x-ua-compatible标题来覆盖他们建议的呈现选项

<meta http-equiv="x-ua-compatible" content="IE=9" />

这会强制您的浏览器进入 IE9 标准模式(不评估文档类型)。您可以使用IE=edge它强制进入可能的最新模式(在 Internet Explorer 10 上,这将是 IE 10 标准),但不鼓励这样做。相反,将其设置为您测试过的最新模式。

如果x-ua-compatible标题设置为 IE10,但用户在较早的浏览器上访问您的页面,则将使用最近的渲染引擎。例如,如果用户使用 IE9 访问您的页面,并且您的元标记指示浏览器使用 IE10,则浏览器将回退到 IE9 标准模式。

请注意,这IE=9会导致浏览器进入 IE9 标准模式。它不一定会导致浏览器表现得像 IE9 一样。如果您希望浏览器像 IE9 一样运行,您需要使用以下EmulateIE9内容:

<meta http-equiv="x-ua-compatible" content="IE=EmulateIE9" />

这会导致浏览器回退到 DOCTYPE(如果存在),以确定文档模式是标准还是 Quirks。

有关详细信息,请参阅定义文档兼容性

我打算将这个 hack 留在实时站点上,所以我不能强制使用 IE9,因为这样的设置不适用于 IE8s。我对么?
2021-04-21 01:53:56
@vault-boy 请看我回答的最后一部分。您应该避免,edge因为您无法测试未发布的浏览器。相反,将其设置为您测试过的最新版本。如果您正在进行任何 Windows 8 测试,您可以在 IE10 上检查您的站点,如果它有效,请设置为 IE10。
2021-04-23 01:53:56
如果声明的引擎 (IE10) 高于浏览器的能力,浏览器​​将使用其最高可用引擎(IE8 上的 IE8 标准)。
2021-04-24 01:53:56
谢谢。在上面的评论中,我试图找出“最佳可用引擎”的语法是什么,所以我总是在 IE8 上使用 IE8 引擎,在 IE9 上使用 IE9 引擎。如果我将它设置为 content="IE=9" IE8 大概不会理解这一点并且可能仍然在兼容模式下工作
2021-04-30 01:53:56
好吧,如果您安装了 IE8,它将不会使用 IE10 引擎,除非您将浏览器本身升级到 IE10。对?
2021-05-02 01:53:56

对于在 Google 上访问此线程的任何人,这是另一种选择:

使用位于http://www.quirksmode.org/js/detect.html的脚本......

if (BrowserDetect.browser == 'Explorer')
{
    if (document.documentMode == 7 && BrowserDetect.version > 7)
    {
        // user is running IE in compatability mode
    }
}
2021-04-26 01:53:56
我也遵循了这种方法,结合了 navigator.userAgent(用于识别版本)和 document.documentMode。
2021-05-02 01:53:56
另外,抛弃插件... if( document.documentMode && document.documentMode < 7 ){ // 这就是你所需要的!第一次检查确认它是 IE,第二次确认它是 IE5、IE6 或兼容模式下的任何更新版本。
2021-05-07 01:53:56

这对我有用:

/**
 * Actual IE8-Browser running in IE8-Compat-Mode or IE7 Mode?
 */
MyUtils.isIE8CompatMode= function(){
    if($.browser.msie && navigator.userAgent.indexOf('MSIE 7.0')>=0){
        return true;
    }
    return false;
}

一个实际的 IE8 浏览器有 3 种文档模式(IE7、IE8 和 Quirks)和 3 种浏览器模式(IE7、IE8 和 IE8 兼容性)。我们可以通过以下方式强制文档模式为 IE8:

 <meta http-equiv="X-UA-Compatible" content="IE=8,chrome=1"/>

但是,我们不能强制执行由浏览器配置决定的浏览器模式。例如:我们的一些客户在他们的兼容性视图设置对话框中选中了“以兼容模式呈现所有页面”复选框。如果是这样,我们也无能为力。

请参阅此站点上非常有启发性的图表:

-> ie8 如何确定兼容模式

我们用上面的函数做什么?由于我们的页面在兼容模式下会显示一些小故障,我们需要告诉用户为什么它看起来很糟糕以及他可以做些什么。所以我们使用上面的函数来判断我们是否遇到了麻烦,然后向用户呈现一个小警告。

在 ie9 和 ie10 兼容模式下,我们的应用程序看起来不错,所以我们不需要它。此回复可被视为对以下问题的回答:检测被标记为与此模式重复的ie8 兼容模式也许它可以帮助某人。

这是我为位于圣何塞的一家大型拍卖网站所做的相当可靠的检查。

var userAgentString = navigator.userAgent;

if(/MSIE 7\.0/gi.test(userAgentString) && /Trident/gi.test(userAgentString)){
    // compatibility mode
    // .... code goes here ....
}