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

时间:2013-09-18 12:02:57

标签: 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;
}

以下是我尝试但未能成功的链接。

10 个答案:

答案 0 :(得分:53)

您可以通过以下检查明确检测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。

在您实际需要使用上述浏览器检测的情况下非常罕见。 在大多数情况下,首选功能检测方法

答案 1 :(得分:13)

 isIE11 = !!window.MSStream;

 if(isIE11){
   /* Something */
 }

答案 2 :(得分:12)

使用!(window.ActiveXObject) && "ActiveXObject" in window明确检测IE11。

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

答案 3 :(得分:5)

如前所述 - 不进行浏览器检测,而是进行特征检测。但是,当我看到你的脚本是一个旧版本的脚本时,会在这里流传。 这是检测IE 11 aswell的更新版本:

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

答案 4 :(得分:3)

如果您避免浏览器检测,对您来说会更好;如果你需要它,这是MS团队的一个很好的解释:

在极少数情况下,可能需要唯一识别IE11预览。使用Trident令牌执行此操作

用户代理字符串更改

  

对于许多传统网站而言,其中一些最多   IE11 Preview的可见更新涉及用户代理字符串。这里的   在Windows 8.1预览版中报告的IE11预览:JavaScript

     

Mozilla / 5.0(Windows NT 6.3; Trident / 7.0; rv:11.0),如Gecko

     

与以前版本的Internet Explorer一样,部分是用户代理   字符串因环境而异。这是IE11的字符串   在Windows 7上预览:JavaScript

     

Mozilla / 5.0(Windows NT 6.1; Trident / 7.0; rv:11.0),如Gecko

     

如果将这些字符串与早期版本报告的字符串进行比较   在Internet Explorer中,您会发现以下更改:   兼容(“兼容”)和浏览器(“MSIE”)令牌   除去。添加了“like Gecko”令牌(为了与之保持一致)   其它浏览器)。浏览器的版本现在由新的报告   修订版(“rv”)令牌。这些更改有助于防止IE11预览   被(错误地)识别为早期版本。一般来说,你   应避免检测特定浏览器或浏览器版本。该   这些测试的假设倾向于导致误报   浏览器更新时的结果。而是像你一样检测功能   需要它们并使用渐进增强来提供简化   浏览器或不支持这些功能的设备的体验   你需要。在极少数情况下,可能需要唯一识别IE11   预习。使用Trident令牌执行此操作

链接:http://msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx

答案 5 :(得分:1)

更简单有效的代码并检测所有版本的IE / Edge:

if(navigator.appVersion.indexOf("MSIE") != -1 || navigator.appVersion.indexOf("Trident") != -1 || navigator.appVersion.indexOf("Edge") != -1){
// is IE
}

答案 6 :(得分:0)

我最近使用以下代码来检测IE,并且它也适用于IE 11

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

想法是寻找vedor前缀。

答案 7 :(得分:0)

使用功能检测&#39;口头禅使我神秘。当您遇到错误时,如何确定哪些功能&#39;是罪魁祸首?以这段代码为例:

        $('input[name^=qty]').keyup(function(e) {
            if (this.value.match(/[^0-9\/]*/g)) {
                this.value = this.value.replace(/[^0-9\/]/g, '')
            }
        });

它会在用户输入时从输入字段中删除非数字字符。适用于FF,Chrome和Safari。在任何版本的IE中都不起作用(至少11个):输入字段上的任何后续绑定都将失败。

答案 8 :(得分:-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>

答案 9 :(得分:-9)

请勿进行浏览器检测!它会断开,会导致问题。

IE11与以前的IE版本具有完全不同的用户代理字符串;它不再包含“MSIE”文本。这就是您的检测代码不起作用的原因。

这里需要注意的是,他们这样做的原因是故意的。他们想要打破这样的浏览器检测脚本。

可以更改您的代码以使用IE11,但我强烈建议您不要这样做,因为当IE12问世时,您可能会再次遇到相同的问题。

那他们为什么要打破浏览器检测脚本呢?简单:因为IE11没有以前版本的bug,并且它有很多新功能。因此,如果您正在进行浏览器检测,因为IE具有某些错误或缺少功能,并且您已根据浏览器检测获得了修复这些问题的代码,那么该代码实际上可能会导致IE11中不需要修复的问题更严重。

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

如果您希望支持某些特定功能,但在较旧的IE版本(或其他旧版浏览器)中缺少这些功能,请不要使用浏览器检测来解决此问题。您应该使用功能检测

功能检测意味着检查浏览器是否支持您要使用的特定功能。最常见的方法是使用Modernizr库。他们网站上的文档将指导您完成设置。

旧的IE版本中存在一些难以检测的错误,对于这些少数情况,使用浏览器检测作为最后的手段是有效的,但这些情况实际上仅适用于IE6及更早版本。也许偶尔会出现在IE7上。但是你在问题中已经说过你只是在看IE8及以后的版本,所以不适用。

坚持功能检测;它是更可靠,更好的练习,并且在发布新浏览器版本时不会突然崩溃。