我可以在 IE7 兼容模式下区分客户端的浏览器是 IE7 还是 IE9 吗?我想弄清楚我是否可以在我的网站上做一个 JS 检查,它会识别两种不同的东西并根据结果做不同的事情
- 那个浏览器是IE7
- 该浏览器处于 IE7 兼容模式
我有第一个条件正常工作,因为几乎到处都在说如何做到这一点。不确定第二个和/或两者的组合。
我可以在 IE7 兼容模式下区分客户端的浏览器是 IE7 还是 IE9 吗?我想弄清楚我是否可以在我的网站上做一个 JS 检查,它会识别两种不同的东西并根据结果做不同的事情
我有第一个条件正常工作,因为几乎到处都在说如何做到这一点。不确定第二个和/或两者的组合。
至少对于 IE8 和 IE9,您可以检查其中是否navigator.userAgent
包含子字符串Trident
。IE8+的用户代理中总是有一个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)。
我不相信有一种方法可以检测用户的浏览器是否处于兼容模式。他们的用户代理字符串将由他们的浏览器模式决定,他们的文档模式将由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。
有关详细信息,请参阅定义文档兼容性。
对于在 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
}
}
这对我有用:
/**
* 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 ....
}