在 IE7 兼容模式下,我可以区分客户端的浏览器是 IE7 还是 IE9?我试图弄清楚我是否可以在我的网站上进行 JS 检查,这将识别两种不同的事情并根据结果做不同的事情
- 那个浏览器是IE7
- 该浏览器处于 IE7 兼容模式
我的第一个条件可以正常工作,因为到处都在说如何去做。不确定第二个和/或两者的组合。
在 IE7 兼容模式下,我可以区分客户端的浏览器是 IE7 还是 IE9?我试图弄清楚我是否可以在我的网站上进行 JS 检查,这将识别两种不同的事情并根据结果做不同的事情
我的第一个条件可以正常工作,因为到处都在说如何去做。不确定第二个和/或两者的组合。
至少对于 IE8 和 IE9,您可以检查其中是否navigator.userAgent
有子字符串Trident
。IE8+的用户代理中总是有一个Trident
,而 IE7 没有。请参阅此答案和其中的 MSDN 链接。
IE10 似乎更棘手:在下面的评论中报告说,IE7 仿真模式Trident
并不总是存在。如果 IE10 在 IE7 可用的任何平台上不可用,操作系统字符串(例如)可能仍会显示 IE10。Windows NT 6.2
另请注意,HTTPUser-Agent
标头可能并不总是匹配navigator.userAgent
。至少在 IE9 具有兼容模式(发送 IE7User-Agent
标头)但IE=Edge
在响应中检测到类似内容(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 兼容性)。我们可以通过以下方式将 Document-Mode 强制为 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 ....
}