您可以通过以下检查(使用功能检测)显式检测 IE11:
if (Object.hasOwnProperty.call(window, "ActiveXObject") && !window.ActiveXObject) {
// is IE11
}
说明:所有版本的 IE(除了非常旧的版本)都有window.ActiveXObject
属性存在。然而,IE11 对 DOM 隐藏了该属性,并且该属性现在未定义。但是属性本身存在于对象中,因此检查属性是否存在在所有 IE 版本中都返回 true,但在 IE11 中它也返回 false 进行第二次检查。最后,hasOwnProperty
通过 Object 调用,因为在 IE8 中(我相信更早)window
不是一个instanceof Object
也没有hasOwnProperty
方法。
另一种方法,使用 userAgent 字符串:
var ua = window.navigator.userAgent;
var versionSplit = /[\/\.]/i;
var versionRe = /(Version)\/([\w.\/]+)/i; // match for browser version
var operaRe = /(Opera|OPR)[\/ ]([\w.\/]+)/i;
var ieRe = /(?:(MSIE) |(Trident)\/.+rv:)([\w.]+)/i; // must not contain 'Opera'
var match = ua.match(operaRe) || ua.match(ieRe);
if (!match) {
return false;
}
if (Array.prototype.filter) {
match = match.filter(function(item) {
return (item != null);
});
} else {
// Hello, IE8!
for (var j = 0; j < match.length; j++) {
var matchGroup = match[j];
if (matchGroup == null || matchGroup == '') {
match.splice(j, 1);
j--;
}
}
}
var name = match[1].replace('Trident', 'MSIE').replace('OPR', 'Opera');
var versionMatch = ua.match(versionRe) || match;
var version = versionMatch[2].split(versionSplit);
如果它的 userAgent 字符串没有被欺骗,这将检测任何版本的 IE。
在极少数情况下,您实际上需要如上所述使用浏览器检测。在大多数情况下,特征检测方法是可取的。