检查IE版本的方法

问题背景

由于性能方面的考虑,我们基于B/S架构的程序要求客户最好使用IE8及以后的版本。由于IE8支持兼容性视图模式,同事写的检查IE版本的代码在工作中发现并不可靠,为此花费时间研究了一下这个问题。本文记录下一些研究心得。

注:约束是在前端使用JS脚本检测,因此忽略掉Asp.net服务端HttpBrowserCapabilities相关内容。

如何限制只检测一次

如果checkIEVersion分布在各个页面的onload事件中(例如通过asp.net的母板),那么访问每个页面都会有一次消耗。合适的方法是只在网站的default.html文件中进行IE版本检查,这样可确保访问网站时只检测一次。

如何使用navigator检测版本

与第一感不同,navigator的appVersion属性并没有userAgent属性可靠。

 

userAgentd的内容示例如下:

Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.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; .NET CLR 1.1.4322)

 

结合RegEx可解析出正确的版本号:

function getInternetExplorerVersion()

// Returns the version of Internet Explorer or a -1

// (indicating the use of another browser).

{

var rv = -1; // Return value assumes failure.

if (navigator.appName == 'Microsoft Internet Explorer')

{

var ua = navigator.userAgent;

var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");

if (re.exec(ua) != null)

rv = parseFloat( RegExp.$1 );

}

return rv;

}

如何应对IE8兼容性模式的问题

当IE8处于兼容性视图模式时,userAgent给出的版本信息为MSIE 7.0。有两种解决方法:

1. 检测userAgent中新增的Trident标志,Trident/4.0指示IE引擎版本为IE 8,Trident/5.0指示IE引擎版本为IE 9

2. 检测document.documentMode属性是否存在,该属性首次在IE 8引入

 

参考列表

主要的参考资料如下:

1. Detecting Internet Explorer More Effectively

2. Using the navigator object to detect client's browser

3. The Internet Explorer 8 User-Agent String (Updated Edition)

4. Defining Document Compatibility

原文地址:https://www.cnblogs.com/hbzhang/p/2323075.html