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

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

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

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

对于至lessIE8和IE9,你可以检查navigator.userAgent是否有子串Trident 。 一个IE8 +在其用户代理中总是有一个Trident ,IE7没有。 看到这个答案和它的MSDN链接 。

IE10似乎比较棘手:在下面的评论中报道, Trident并不总是以IE7仿真模式出现。 如果IE10在IE7可用的任何平台上都不可用,则操作系统string(例如Windows NT 6.2 )可能仍会显示IE10。

另请注意,HTTP User-Agent头可能并不总是与navigator.userAgent匹配。 这种情况至less在具有兼容模式的IE9(发送IE7 User-Agent标题)的情况下,但是在响应( navigator.userAgent转回到IE9)中检测到类似于IE=Edge的内容。

我不相信有一种方法来检测用户的浏览器是否在compat模式。 他们的用户代理string将由他们的浏览器模式确定,他们的文档模式将由x-ua-compatible元标记(或标题)的存在或可能由所使用的文档types来确定。

兼容模式旨在保护现代浏览器用户免受依赖于过时function或黑客的页面的侵害。 这不是你想要testing的东西。 相反,编写符合标准的代码将被浏览器在compat模式或non-compat模式下理解。

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

浏览器模式: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标头来覆盖其build议的呈现选项:

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

这迫使您的浏览器进入IE9的标准模式(没有评估的DOCTYPE)。 您可以使用IE=edge强制它进入最新的模式(在Internet Explorer 10上,这将是IE 10标准),但这并不鼓励。 相反,将其设置为您testing的最新模式。

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

请注意, IE=9会导致浏览器进入IE9标准模式。 它不一定会导致浏览器像IE9一样行事。 如果您希望浏览器的行为与IE9一样,您可能需要使用EmulateIE9内容:

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

这会导致浏览器在DOCTYPE(如果存在)确定文档模式是“标准”还是“怪癖”。

有关更多信息,请参阅定义文档兼容性 。

对于任何人在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和怪癖)和3浏览器模式(IE7,IE8和IE8兼容性)。 我们可以强制文档模式为IE8:

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

但是,我们无法执行由浏览器configuration确定的浏览器模式。 例如:我们的一些客户在兼容性 – 查看 – 设置 – 对话框中选中了“在兼容模式下渲染所有页面” – 勾选框。 如果是这样的话,我们无能为力。

看到这个网站非常有启发性的图表:

– > ie8如何确定兼容模式

我们使用上述function是什么? 由于我们的页面在兼容模式下显示一些故障,我们需要告诉用户,为什么看起来不好,以及他可以做些什么。 所以我们使用上面的函数来告诉我们是否有麻烦,然后给用户一个小警告。

在ie9和ie10兼容模式我们的应用程序看起来不错,所以我们不需要在那里。 这个响应可能被认为是对这个问题的回答: 检测ie8兼容模式 ,这个模式被标记为这个模式的一个副本。 也许它有助于某人。

这是一个相当防弹的检查,我为圣何塞的一个大型拍卖网站。

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