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

17

你好,我想检测浏览器,IE 8或更高版本最适合我。为此,我使用了以下代码,但它无法识别IE 11。对于其他浏览器,它可以正确地检测。

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;
}

以下是链接,我也尝试了但没有成功。


7
不要进行浏览器检测!这样做会导致程序崩溃,并引起问题。 - Spudley
1
为了避免浏览器检测,请参考此链接:http://msdn.microsoft.com/zh-cn/library/ie/bg182625(v=vs.85).aspx - Irvin Dominin
7
如果我们愿意,你可以让我们检测到不良版本的IE吗? 这是现实世界,请简单回答问题。 - mpowered
有时我们需要进行浏览器检测 :-) :我知道我的内部网站既不兼容IE6也不兼容“IE11兼容模式”。在这些情况下,我想显示一个警告消息。这很困难,因为当兼容模式“打开”时,“IE11兼容模式”可能被检测为IE7... - Elo
10个回答

54

您可以使用以下检查(使用特征检测)明确检测IE11:

if (Object.hasOwnProperty.call(window, "ActiveXObject") && !window.ActiveXObject) {
    // is IE11
}
Explanation: 所有版本的IE(除了非常旧的版本)都存在 window.ActiveXObject 属性。然而,IE11将此属性隐藏在DOM中,该属性现在为 undefined。但是,该属性本身存在于对象中,因此检查属性是否存在会在所有IE版本中返回true,但在IE11中,它也会对第二次检查返回false。最后,在IE8(以及我认为更早的版本)中,由于 window 不是 Object 的实例并且没有 hasOwnProperty 方法,因此通过 Object 调用 hasOwnProperty。
Another method, using userAgent string:
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。

在极少数情况下,您实际上需要像上面描述的浏览器检测。 在大多数情况下,首选特性检测方法


5
你的第一个解决方案对我来说完美地起作用了。 - Raza Ahmed
2
非常有创意的解决方案!+1 - Micah Henning
关于 Edge 呢?不包括 IE11? - SuperUberDuper
现在是2022年4月,用户仍在使用IE11,我很讨厌不得不使用这段代码。+1 - 谢谢您,先生。 - JayTee

13
 isIE11 = !!window.MSStream;

 if(isIE11){
   /* Something */
 }

2
这将检测IE10或IE11。如果您需要明确使用IE11,请参阅我的答案。 - mcw
对我来说没问题...简短、简单,希望在未来 12 年及以上也能适用,哈哈... - Robert Petz

12

使用 !(window.ActiveXObject) && "ActiveXObject" in window 显式地检测 IE11。

为了检测任何版本的 IE,请改用 window.ActiveXObject || "ActiveXObject" in window


我使用 (navigator.userAgent.search("MSIE") >= 0) || (!(window.ActiveXObject) && "ActiveXObject" in window),感谢帮助。 - Szymon Toda
正如被接受的答案中所提到的,通过读取userAgent字符串进行浏览器检测是脆弱且不推荐的。微软特别在IE11中更改了UA字符串以破坏此功能。此外,IE中有一些功能可以更改正在传输的UA字符串。因此,再次强调 - 使用功能检测代替。 - mcw
1
在你的第二行代码中,window.ActiveXObject || "ActiveXObject" in window 的前半部分是多余的。 - Royi Namir
1
谢谢这个。正是我需要的。同时似乎可以通过F12开发工具来模拟低版本的浏览器。例如,当模拟IE8从IE11时,用户代理字符串似乎没有改变... - El Ronnoco

5

正如已经提到的那样,不要进行浏览器检测,而是进行功能检测。但是,我看到你的脚本是这里流传的旧版本之一。这是更新后的版本,可以检测IE 11:

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;
                            }

3
最好避免浏览器检测;如果需要,以下是MS团队的一个好解释:
在极少数情况下,可能需要唯一标识IE11 Preview。使用Trident令牌来实现。
用户代理字符串更改
对于许多传统网站,IE11 Preview的一些最显着的更新涉及用户代理字符串。以下是在Windows 8.1 Preview上报告的IE11 Preview:JavaScript的内容:
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
与以前版本的Internet Explorer一样,用户代理字符串的某些部分根据环境而变化。以下是Windows 7上IE11 Preview的字符串:JavaScript的内容:
Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
如果将这些字符串与早期版本的Internet Explorer报告的字符串进行比较,您会发现以下更改:已删除兼容(“compatible”)和浏览器(“MSIE”)令牌。添加了“like Gecko”令牌(以确保与其他浏览器的一致性)。浏览器的版本现在由新的修订(“rv”)令牌报告。这些更改有助于防止IE11 Preview被(错误地)识别为早期版本。通常,应避免检测特定浏览器或浏览器版本。这些测试基础的假设往往会导致浏览器更新时产生错误的正面结果。相反,根据需要检测功能,并使用渐进增强来为不支持所需功能的浏览器或设备提供简化的体验。在极少数情况下,可能需要唯一标识IE11 Preview。使用Trident令牌来实现。
链接:http://msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx

1
更易于编写高效代码,并且能够检测所有版本的IE/Edge:
if(navigator.appVersion.indexOf("MSIE") != -1 || navigator.appVersion.indexOf("Trident") != -1 || navigator.appVersion.indexOf("Edge") != -1){
// is IE
}

0
“使用功能检测”这句话让我感到困惑。当你遇到一个错误时,你怎样才能确定哪个“功能”是罪魁祸首呢?例如,看看这段代码:
        $('input[name^=qty]').keyup(function(e) {
            if (this.value.match(/[^0-9\/]*/g)) {
                this.value = this.value.replace(/[^0-9\/]/g, '')
            }
        });

它会在用户输入时从输入框中删除非数字字符。在 Firefox、Chrome 和 Safari 中运行正常,但在任何版本的 IE(至少到 11)中都无法工作:输入框上的任何后续绑定都将失败。


0

最近我使用了以下代码来检测IE浏览器,对于IE 11也能正常工作

var bs = document.body.style, isIE=false;
if ('msTransition' in bs) {
        isIE = true;
}

这个想法是寻找供应商前缀。


-1

特性检测,特性检测,特性检测

        <script>

    if (!('querySelector' in document)  //this should work in ie 9+
         || !('localStorage' in window)  //ie 8+
         || !('addEventListener' in window)  //ie 8 + (I think)
        || !('matchMedia' in window)) {//ie 10+

        //do your redirect here
    }

</script>

2
这不是“使用特性检测”的口号所意味的。这只是一种不同于用户代理检测的方法... 特性实际上是用户代理的“别名”。 “使用特性检测”意味着,如果您需要某个特定的功能,请检测它... 并在要求时提供备用方案。 - Greg Pettit
我不同意。这些注释只是作为心理占位符而存在的。这是我用来检测功能的方法,可以创建现代SPA客户端体验或重定向到一个只有基本CSS和经典服务器呈现标记的“核心”站点。 - Chris Love

-10

不要进行浏览器检测!这会导致问题并破坏你的程序。

IE11与之前的IE版本有完全不同的用户代理字符串;它不再包含“MSIE”文本。这就是为什么你的检测代码无法工作的原因。

重要的是要注意,他们这样做是故意的。他们希望破坏像这样的浏览器检测脚本。

虽然可以更改代码以适应IE11,但我强烈建议不要这样做,因为当IE12推出时,你可能会再次遇到相同的问题。

那么他们为什么要破坏浏览器检测脚本呢?简单:因为IE11没有之前版本的错误,并且具有许多新功能。因此,如果你正在进行浏览器检测,因为IE存在某些错误或缺少功能,并且你有基于浏览器检测的代码来修复这些问题,那么该代码在IE11中可能会导致更严重的问题,因为这些修复不需要。

IE11已经破坏了你的脚本,但是同样的逻辑适用于所有浏览器和所有版本;检测浏览器和版本几乎总是错误的做法。

如果您想支持特定功能,但在旧版IE(或其他旧版浏览器)中缺少这些功能,请不要使用浏览器检测来解决问题;相反,应该使用特性检测
特性检测是指检查浏览器是否支持您想要使用的特定功能。最常用的方法是使用Modernizr库。他们网站上的文档将指导您完成设置。
旧版IE存在一些难以检测的错误,对于这些情况,使用浏览器检测作为最后的手段是有效的,但这些情况仅适用于IE6及更早版本。偶尔可能适用于IE7。但是,您在问题中已经说明您只关注IE8及更高版本,因此这不适用。
坚持使用特性检测;它更可靠,更好的实践,并且不会在发布新浏览器版本时突然崩溃。

2
你好,感谢您的建议。不幸的是,功能验证在IE 11上也无法正常工作。以下是我的代码。 if (typeof (window.ActiveXObject) == "undefined") {
alert("未经验证"); IsVerified = false; } else { alert("已验证"); IsVerified = true; }这对于所有其他浏览器都可以正常工作,但对于IE 11来说不起作用。任何建议将不胜感激。
- Abhinash Mohanty
23
您的整个发言都没有意义,超出了问题的范围。我想检查用户使用的浏览器。只是这个。 -1 - Szymon Toda
7
是的,IE11并没有以前版本的bug,但它有自己新的bug集合。尤其是当你在使用像ExtJS等javascript库时 :) 我已经困扰了四天,试图解决它们。 - Raza Ahmed
32
嘿,猜猜怎么着?IE10/11仍有漏洞。我们仍有方法来解决它们。他们声称他们的浏览器完美无缺并且没有人应该使用浏览器检测,我认为这非常傲慢,因为一些非常基本的功能仍然无法正常工作。我用例子说明这个问题是输入填充的实现有问题--IE会忽略它直到您将输入设置为空并重新设置值。这不是我的错,他们不能制造出一个合适的浏览器。请回答问题而不注入您不必要的意见。 - mpowered
20
-1 是因为这篇帖子没有试图回答问题。原帖的提问是如何实现某事,而不是该事是否是正确的决定。 - Kevin Laity
显示剩余22条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接