Abh*_*nty 17 javascript asp.net internet-explorer browser-detection internet-explorer-11
您好我想检测浏览器,IE 8或更多将适合我.为此,我使用了以下代码,但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;
}
Run Code Online (Sandbox Code Playgroud)
以下是我尝试但无法成功的链接.
Mes*_*ito 53
您可以使用以下检查显式检测IE11(使用特征检测):
if (Object.hasOwnProperty.call(window, "ActiveXObject") && !window.ActiveXObject) {
// is IE11
}
Run Code Online (Sandbox Code Playgroud)
说明: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);
Run Code Online (Sandbox Code Playgroud)
如果其userAgent字符串未被欺骗,这将检测任何版本的IE.
在您实际需要使用上述浏览器检测的情况下非常罕见.在大多数情况下,特征检测方法是优选的.
小智 13
isIE11 = !!window.MSStream;
if(isIE11){
/* Something */
}
Run Code Online (Sandbox Code Playgroud)
mcw*_*933 12
用于!(window.ActiveXObject) && "ActiveXObject" in window
显式检测IE11.
要检测任何IE版本,请window.ActiveXObject || "ActiveXObject" in window
改用.
小智 5
如前所述-不要进行浏览器检测,而要进行特征检测。但是,正如我所看到的,您的脚本是该脚本的较旧版本,在这里流通。这是检测到IE 11 aswel的更新版本:
function getInternetExplorerVersion()
{
var rv = -1;
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 );
}
else if (navigator.appName == 'Netscape')
{
var ua = navigator.userAgent;
var re = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
if (re.exec(ua) != null)
rv = parseFloat( RegExp.$1 );
}
return rv;
}
Run Code Online (Sandbox Code Playgroud)
Spu*_*ley -10
不要进行浏览器检测!它会损坏,并且会给你带来麻烦。
IE11 的用户代理字符串与之前的 IE 版本完全不同;它不再包含“MSIE”文本。这就是您的检测代码不起作用的原因。
值得注意的是,他们这样做的原因是故意的。他们想像这样破坏浏览器检测脚本。
可以更改代码以使用 IE11,但我强烈建议不要这样做,因为当 IE12 发布时,您可能会再次遇到相同的问题。
那么他们为什么要破坏浏览器检测脚本呢?简单:因为IE11没有以前版本的Bug,而且有很多新功能。因此,如果您因为 IE 有某些错误或缺少功能而进行浏览器检测,并且您有代码来根据浏览器检测来修复这些问题,那么该代码实际上可能会在不需要修复的 IE11 中导致更严重的问题。
IE11破坏了你的脚本,但同样的逻辑适用于所有浏览器和所有版本;检测浏览器和版本几乎总是错误的做法。
如果您想要支持某些特定功能,但在较旧的 IE 版本(或其他较旧的浏览器)中缺失,请不要使用浏览器检测来解决该问题;您应该使用特征检测来代替。
功能检测意味着检查浏览器以查看它是否支持您想要使用的特定功能。最常见的方法是使用Modernizr库。他们网站上的文档将指导您完成设置。
旧版 IE 中存在一些难以检测的错误,对于这少数情况,使用浏览器检测作为最后手段是有效的,但这些情况实际上仅适用于 IE6 及更早版本。也许偶尔会出现在 IE7 上。但您在问题中声明您只关注 IE8 及更高版本,因此这不适用。
坚持特征检测;它更可靠,更好的实践,并且不会在新的浏览器版本发布时突然中断。
归档时间: |
|
查看次数: |
35194 次 |
最近记录: |