如何在Asp.net中使用javascript检测IE 11

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.

在您实际需要使用上述浏览器检测的情况下非常罕见.在大多数情况下,特征检测方法是优选的.

  • 您的第一个解决方案是为我完美工作 (5认同)
  • 很有创意的方案!+1 (2认同)

小智 13

 isIE11 = !!window.MSStream;

 if(isIE11){
   /* Something */
 }
Run Code Online (Sandbox Code Playgroud)

  • 这将检测IE10或IE11.如果您明确需要IE11,请参阅我的回答. (2认同)

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 及更高版本,因此这不适用。

坚持特征检测;它更可靠,更好的实践,并且不会在新的浏览器版本发布时突然中断。

  • 嘿,你猜怎么着?!?IE10/11仍然存在bug。我们仍然有办法解决它们。我认为他们说他们的浏览器是完美的,并且当一些非常基本的功能仍然不起作用时,没有人应该使用浏览器检测,这是非常傲慢的。我的用例是输入填充的损坏实现 - IE 只是简单地忽略它,直到您将输入设置为 '' 并返回到您的值。他们不能制造出合适的浏览器,这不是我的错。拜托,拜托,请只回答问题,不要加入你不必要的意见。 (32认同)
  • 你的整个演讲毫无意义,并且超出了该问题的范围。我想检查用户运行的浏览器。时期。-1 (23认同)
  • -1,因为这篇文章并不试图回答这个问题。OP 询问的是如何完成某件事,而不是那件事是否是正确的举动。 (20认同)
  • 是的,IE11没有以前版本的错误,感染它有自己的新错误集合。大多数时候当你使用 ExtJS 等 javascript 库时:) 我在过去四天里一直在尝试解决它们 (7认同)
  • 您好,谢谢您的建议。不幸的是,功能验证也不适用于 IE 11。下面是我的代码。if (typeof (window.ActiveXObject) == "未定义") { alert("未验证"); 已验证=假;} else {alert("已验证"); 已验证 = true; 这对于所有其他浏览器都可以正常工作,但对于 IE 11 则不起作用。任何建议将不胜感激。?? (2认同)
  • ActiveXObject 验证现已隐藏 - http://msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx。 (2认同)
  • @Spudley - 我无意冒犯,但这不是一个合理的建议。IE11 的 bug 与 IE10 一样多(如果不是更多的话),只是不同而已。我们无法通过特征检测来检测错误,所以猜猜唯一的其他解决方案是什么?告诉我们的客户改用 Chrome。我们的产品拥有大约 20,000 名用户。在 IE9 和 IE10 中,我们能够通过检测浏览器来解决这些错误。对于 IE11,没有这样的选项......所以现在我们的呼叫中心代表将所有 IE11 用户切换到 Chrome(自 IE11 发布以来,已有 5,000 多次迁移)。我认为微软没有考虑清楚这一点。 (2认同)
  • @Kywillis:另外,请不要使用 Chrome 作为所有浏览器都必须遵守的基准:Chrome 有很多自己的错误和怪癖。使用它作为绝对可靠的基准与我们十年前在 IE6 上犯的错误是一样的。 (2认同)