我可以区分客户端的浏览器是IE7还是IE9在IE7兼容模式下?我想弄清楚我是否可以在我的网站上进行JS检查,这会检查两种不同的东西并根据结果做不同的事情
我的第一个条件正常工作,因为它几乎无处不在,如何做到这一点。不确定第二个和/或两者的组合。
答案 0 :(得分:8)
至少对于IE8和IE9,您可以检查navigator.userAgent
中是否包含子串Trident
。 IE8 + 始终在其用户代理中有Trident
,其中IE7没有。请参阅this answer和the MSDN link in it。
IE10看起来比较棘手:下面的评论中报告了IE7仿真模式Trident
始终不存在。 如果在IE7可用的任何平台上IE10都不可用,OS字符串(例如Windows NT 6.2
)可能仍会显示IE10。
另请注意,HTTP User-Agent
标头可能并不总是与navigator.userAgent
匹配。至少IE9具有兼容性模式(发送IE7 User-Agent
标头),但在响应中检测到IE=Edge
之类的内容(navigator.userAgent
转回IE9)。
答案 1 :(得分:7)
我不相信有办法检测用户的浏览器是否处于compat模式。他们的用户代理字符串将由他们的浏览器模式决定,他们的文档模式将由x-ua-compatible
元标记(或标题)的存在确定,或者可能由使用的doctype确定。
兼容性模式旨在保护现代浏览器用户免受依赖旧的和过时的功能或黑客攻击的页面的影响。这不是你想要测试的东西。相反,编写符合标准的代码,浏览器将在compat模式或非compat模式下理解这些代码。
以下是不同浏览器模式和文档模式的各种结果:
浏览器模式:IE10 Compat查看/文档模式: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
正如您所看到的,通过这两种方法无法判断用户是否处于compat视图中。
如果您的网站出现在兼容性视图列表中,您可以通过提供自己的x-ua-compatible
标题来覆盖其建议的呈现选项:
<meta http-equiv="x-ua-compatible" content="IE=9" />
这会强制您的浏览器进入IE9标准模式(不评估doctype)。您可以使用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。
有关详细信息,请参阅Defining Document Compatibility。
答案 2 :(得分:3)
对于在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
}
}
答案 3 :(得分:2)
这对我有用:
/**
* 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"/>
但是,我们无法强制执行浏览器模式,这是由浏览器配置决定的。例如:我们的一些客户在其Compatibility-View-Settings-Dialog中选中了“以兼容模式呈现所有页面”-checkbox。 如果是这种情况,我们就无能为力。
请参阅本网站上非常有启发性的图表:
- &GT; How ie8 determines compatibility-mode
我们使用上述功能是什么?由于我们的页面在兼容模式下显示出一些故障,我们需要告诉用户,为什么它看起来很糟糕以及他能做些什么。因此,我们使用上述函数来判断我们是否遇到麻烦,然后向用户发出一个小警告。
在ie9和ie10兼容模式中,我们的应用程序看起来很好,所以我们不需要它。此回复可能被视为此问题的答案:detect ie8 compatibility mode被标记为此问题的副本。也许这有助于某人。
答案 4 :(得分:0)
这是我在圣何塞的大型拍卖网站上进行的一次相当防弹的检查。
var userAgentString = navigator.userAgent;
if(/MSIE 7\.0/gi.test(userAgentString) && /Trident/gi.test(userAgentString)){
// compatibility mode
// .... code goes here ....
}