通常我们提倡特性检测,但那是针对具体的功能开发的时候,如果要检测浏览器类型以及版本,就不应该使用特性检测了。例如我们经常检测 IE6 的代码是:

var isIE6 = !!window.XMLHttpRequest;

我们不能排除第三方类库为 IE6 增加XMLHttpRequest方法,例如这个 XMLHttpRequest兼容库
所以应该使用userAgent代理字符串来检测浏览器,这个字符串就是为前后端提供环境识别的。

很多情况下,我们其实只需要识别出是否是 IE,以及 IE 的版本,下面这一行代码就可以办到:

var isIE = +(navigator.userAgent.match(/MSIE (\d+)/) && RegExp.$1);

然后就可以使用判断if(isIE){} 或者 if(isIE===6){}

但是,以上代码并不能识别 IE11 及以上版本,因为 IE11 修改了 userAgent 字符串,不再包含MSIE的标识。IE11 感觉自己高大上了,不能再和你们这群奇模怪样的 IE6-10 混了,加上了 like Gecko 标识,想要蒙混过关。

// IE 10 userAgent
"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.3; WOW64; Trident/6.0)"
// IE 11 userAgent
"Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko"
// FireFox userAgent
"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0"
// Chrome userAgent
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36"

IE11 为了使自己更像一款现代浏览器,支持现行标准,丢掉包袱(查看 IE11 中的兼容性更改),使用老的特性检测或者老的代理字符串检测方式已经不能区分出 IE11 了,成功跻身到高富帅行列。

但是,IE11 虽然是 IE 家族中的高富帅,其余屌丝也得照顾,所以document.documentMode是万万不能丢的。这个 IE 独有的属性为我们提供了简便可靠的识别。因为document.documentMode本身就是标识 IE 浏览器文档模式的,所以不属于功能特性。

最终判断 IE 的代码

var isIE = document.documentMode || +(navigator.userAgent.match(/MSIE (\d+)/) && RegExp.$1)