JavaScript:如果IE7或IE8兼容模式,我可以检测IE9吗?

我需要知道如果浏览器通过用户代理string标识为IE7或IE8真的是那些浏览器,或者是否在IE9在7或8兼容模式。

从我在用户代理string中可以看到的一个在IE7兼容模式下的IE9,为真实的IE7提供了一个相同的string。 是否有一个额外的属性/元素/对象,我可以testing,看看它是真的“真的”变相的IE9?

我假设文档模式将无法帮助,因为我的脚本加载到的页面可能是强迫怪异或强制一个特定的设置。

我希望IE9将有一些存在的属性,可testing,无论是在7,8或9模式。


编辑添加…

好的,我明白我现在要去哪里了。 我正在使用“浏览器模式”下拉菜单,并将其切换到IE8和IE7,并认为这是“IE8兼容模式”和“IE7兼容模式”分别。 这当然是不正确的。 开发人员工具的浏览器模式确实是将其切换为“像”那些旧的浏览器,所以只报告原始的useragentstring。

如果我将浏览器模式保留在IE9或IE9兼容性下,并尝试使用文档模式下拉变体,那么我确实会在所有8种组合(两种浏览器模式和4种文档模式)下都显示“Trident / 5.0”。 我只需要避开select浏览器模式IE7和IE8,因为他们真的是(模拟)IE7和IE8。

因此,页面,非开发人员用户,元标记或Microsoft的兼容性列表将无法将IE9置于无法识别的状态。

只要使用if(navigator.userAgent.indexOf("Trident/5")>-1)就足够了。

不要担心,这不适用于样式,格式,逻辑或页面内容。 我使用function检测这些东西。 我只需要检测IE9(不pipe它在哪个模式),并做出一个非页面内容的决定。

感谢您的build议和链接指导我的答案。

实际上用IE9在IE7兼容模式下运行的用户代理string是不同的,所以这是区分不同IE版本的最好方法之一。

介绍IE9的用户代理string :

与IE8类似,IE9的兼容性视图将映射到IE7标准模式,而在兼容性视图中IE9的UAstring将是:

 Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0) 

在兼容性视图中,IE9通过应用程序版本号(Mozilla / 4.0)和版本令牌(MSIE 7.0)将自身报告为IE7。 这是为了兼容性而完成的。 从“Trident / 4.0”到“Trident / 5.0”,递增的Trident令牌允许网站区分在Compat View中运行的IE9和在Compat View中运行的IE8

(强调加我)。 因此,用户代理string与报告自己是“Mozilla / 4.0”和MSIE 7.0相同,但IE9将始终是Trident / 5.0 – 无论是MSIE 7.0,MSIE 8.0还是MSIE 9.0。

其实你应该看看这个伟大的编译: 浏览器ID(用户代理)string ,甚至更好的useragentstrings.com

document.documentMode是文档模式的最佳方式。

IE7不包含任何关于Trident的信息

 User-Agent : Mozilla/4.0 (compatible; MSIE 7.0) 

IE8包含这个string:“Trident / 4.0”

 User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0) 

IE9包含这个string:“Trident / 5.0”

IE9兼容模式:

 User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0) 

IE9在正常模式下:

 User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0) 

这是IE9所有浏览器和文档模式的表格 :

所有浏览器和文档模式的表格

我希望IE9将有一些存在的属性,可testing,无论是在7,8或9模式。

检查例如style.opacity ,它是在IE9中引入的,无论兼容模式如何:

 <![if IE]> <script> if(typeof document.documentElement.style.opacity!='undefined') { //this must be at least IE9 } </script> <![endif]> 

有时需要从服务器variables中读取用户代理string,而不是从JavaScript导航器对象中读取。

比较差异:

  • ASP经典, IE11

    • 客户端javascript,navigator.userAgent:“ Mozilla / 5.0(compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)

    • 服务器ASP,Request.ServerVariables(“HTTP_USER_AGENT”):“ Mozilla / 5.0(Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv:11.0)像Gecko

  • ASP经典, IE11兼容模式

    • 客户端javascript,navigator.userAgent:“ Mozilla / 5.0(compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS))

    • 服务器ASP,Request.ServerVariables(“HTTP_USER_AGENT”):“ Mozilla / 4.0(兼容; MSIE 7.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)

https://stackoverflow.com/a/29288153/2879498

假设你有一个ID为compat-warning的隐藏元素:

Javascript w / jQuery:

 $(function(){ function showCompatWarning() { $('#compat-warning') .css('display','block') .css('height','auto') .show(); } var tridentOffset = navigator.appVersion.indexOf('Trident/'); if ( tridentOffset === -1 ) return; var jscriptVersion = 0; /*@cc_on @*/ /*@if (@_jscript) jscriptVersion = @_jscript_version ; @*/; /*@end @*/ var tridentVersion = parseInt(navigator.appVersion.substr(tridentOffset+8),10); var guessIEVersion = tridentVersion + 4; if (( document.documentMode && jscriptVersion && jscriptVersion < 10 && jscriptVersion !== document.documentMode ) || ( document.compatMode && document.compatMode === 'BackCompat') || ( document.documentMode && document.documentMode < 10 && document.documentMode != guessIEVersion )) showCompatWarning(); }); 

检测和警告,你的第一道防线和最后一道防线兼容地狱。