你好,我想检测浏览器,IE8或更多将适合我。为此,我使用了以下代码,但IE11失败了。对其他人来说,它的检测是正确的。
function getInternetExplorerVersion()
{
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;
}
下面是我也试过但没有成功的链接。
发布于 2013-09-18 04:17:52
不做浏览器检测!它会崩溃,并且会给你带来问题。
IE11的用户代理字符串与以前的IE版本完全不同;它不再包含"MSIE“文本。这就是你的检测代码不能工作的原因。
重要的是要注意,他们这么做的原因是故意的。他们想破解像这样的浏览器检测脚本。
可以将代码更改为使用IE11,但我强烈建议不要这样做,因为当IE12出现时,您可能会再次遇到同样的问题。
那么,他们为什么要破坏浏览器检测脚本呢?简单:因为IE11没有以前版本的bug,而且它有很多新特性。因此,如果您进行浏览器检测是因为IE有某些错误或缺少特性,并且您有代码可以根据浏览器检测来修复这些问题,那么在不需要修复的IE11中,该代码实际上可能会导致更严重的问题。
IE11破坏了您的脚本,但是同样的逻辑适用于所有浏览器和所有版本;检测浏览器和版本几乎总是错误的。
如果有您想要支持的特定特性,但在旧的IE版本(或其他较旧的浏览器)中缺少,请不要使用浏览器检测来解决它;您应该使用特性检测。
特征检测意味着检查浏览器是否支持要使用的特定功能。最常见的方法是使用现代派库。他们网站上的文档将引导你设置它。
在旧的IE版本中有一些很难检测的but,对于这几种情况,使用浏览器检测作为最后手段是有效的,但这些情况实际上只适用于IE6和更早的版本。也许对IE7来说是偶然的。但是您在问题中已经说过,您只查看IE8和以后的版本,所以这不应该适用。
坚持特征检测;它更可靠,更好的实践,并且不会突然崩溃,当一个新的浏览器版本发布。
发布于 2013-11-25 11:45:22
您可以使用以下检查显式地检测IE11 (使用特性检测):
if (Object.hasOwnProperty.call(window, "ActiveXObject") && !window.ActiveXObject) {
// is IE11
}
说明: IE的所有版本(非常旧的除外)都有window.ActiveXObject
属性。然而,IE11将该属性隐藏在DOM中,而该属性现在尚未定义。但是属性本身存在于对象中,因此在所有IE版本中检查属性存在都会返回true,但在IE11中,它也会返回false以进行第二次检查。最后,通过对象调用hasOwnProperty
,因为在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);
如果IE的userAgent字符串没有被欺骗,这将检测到任何版本的IE。
在非常罕见的情况下,您实际上需要使用浏览器检测,如前所述。在大多数情况下,特征检测方法是较好的方法。
发布于 2013-10-25 01:04:03
isIE11 = !!window.MSStream;
if(isIE11){
/* Something */
}
https://stackoverflow.com/questions/18871760
复制相似问题