问题背景
由于性能方面的考虑,我们基于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)