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

Posted

技术标签:

【中文标题】如何在 Asp.net 中使用 javascript 检测 IE 11【英文标题】:How to detect IE 11 with javascript in Asp.net 【发布时间】:2013-09-23 04:26:24 【问题描述】:

您好,我想检测浏览器,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;

下面是我也试过但没成功的链接。

【问题讨论】:

不要做浏览器检测!它会坏掉,给你带来麻烦。 为了避免浏览器检测,请检查msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx 如果我们愿意,您让我们检测有缺陷的 IE 版本怎么样?这是现实世界,只要回答问题。 我们有时需要进行浏览器检测 :-) : 我知道我的 Intranet 网站既不兼容 IE6 也不兼容“IE11 兼容模式”。我想在这些情况下显示警告消息。这很难,因为当兼容模式为“开”时,“IE11兼容模式”可能会被检测为IE7... 【参考方案1】:

您可以通过以下检查(使用特征检测)明确检测 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 边缘呢?而不是 ie11?【参考方案2】:
 isIE11 = !!window.MSStream;

 if(isIE11)
   /* Something */
 

【讨论】:

这将检测 IE10 或 IE11。如果您明确需要 IE11,请参阅我的回答。 对我有用...简短,简单,希望到时候能适用于 12 岁及以上,哈哈...【参考方案3】:

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

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

【讨论】:

我用(navigator.userAgent.search("MSIE") &gt;= 0) || (!(window.ActiveXObject) &amp;&amp; "ActiveXObject" in window),谢谢帮助 如接受的答案中所述,通过读取 userAgent 字符串进行浏览器检测是脆弱的,不推荐。微软专门更改了 IE11 中的 UA 字符串来打破这一点。此外,IE 中的某些功能允许它更改正在传输的 UA 字符串。所以,再次使用特征检测。 在你的第二行window.ActiveXObject || "ActiveXObject" in window第一部分是多余的。 谢谢。正是我需要的。似乎也可以通过 F12 开发工具模拟较低的浏览器。例如,从 IE11 模拟 IE8 时,用户代理字符串似乎没有改变......【参考方案4】:

如前所述 - 不要进行浏览器检测,而是进行特征检测。但是,正如我所见,您的脚本是在此处流传的脚本的旧版本。 这是检测 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;
                            

【讨论】:

【参考方案5】:

如果您避免浏览器检测,对您会更好;如果您需要,这里是 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) 像 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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

我最近使用以下代码来检测一般的 IE,它在 IE 11 上也能正常工作

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

这个想法是寻找 vedor 前缀。

【讨论】:

【参考方案8】:

“使用特征检测”的口号让我很困惑。当您遇到错误时,您如何确定罪魁祸首是什么“功能”?以这段代码为例:

        $('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 个):输入字段上的任何后续绑定都将失败。

【讨论】:

【参考方案9】:

特征检测、特征检测、特征检测

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

【讨论】:

这不是使用特征检测的口头禅。这只是用户代理检测的不同途径......这些功能实际上是用户代理的“别名”。 “使用特征检测”意味着如果您需要某个特征,检测它......并在需要时提供回退。 我不同意。 cmets 仅用作心理占位符。这是我用来创建现代 SPA 客户端体验或重定向到“核心”站点的功能检测,该站点只是一些带有经典服务器呈现标记的基本 CSS。【参考方案10】:

不要做浏览器检测!它会坏掉,给你带来麻烦。

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

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

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

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

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

如果您想支持某些特定功能,但在旧版 IE(或其他旧版浏览器)中缺少,请不要使用浏览器检测来解决问题;您应该改用特征检测

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

旧版 IE 中存在一些难以检测的 bug,对于这少数情况,将浏览器检测作为最后手段是有效的,但这些情况实际上仅适用于 IE6 及更早版本。也许偶尔为IE7。但是您在问题中表示您只查看 IE8 及更高版本,因此不适用。

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

【讨论】:

您好,感谢您的建议。不幸的是,功能验证也不适用于 IE 11。以下是我的代码。 if (typeof (window.ActiveXObject) == "undefined") alert("未验证"); IsVerified = 假; else 警报(“已验证”); IsVerified = true;这适用于所有其他浏览器,但对于 IE 11 它不起作用。任何建议都会非常感激。 ?? 您的整个演讲毫无意义,超出了该问题的范围。我想检查浏览器用户运行的内容。时期。 -1 是的 IE11 没有以前版本的错误,感染它有自己的新错误集合。大多数情况下,当您使用 ExtJS 等 javascript 库时 :) 我在过去四天试图解决它们时陷入困境 嘿,你猜怎么着?!? IE10/11 仍然有错误。我们仍然有办法解决它们。我认为他们非常傲慢地说他们的浏览器是完美的,当一些非常基本的功能仍然不起作用时,没有人应该使用浏览器检测。我的用例是用于输入填充的损坏实现——IE 只是简单地忽略它,直到您将输入设置为 '' 并返回到您的值。他们无法制作合适的浏览器不是我的错。请,请,请只回答问题,不要发表您不必要的意见。 -1 因为这篇文章没有试图回答这个问题。 OP 是在问如何完成某件事,而不是问那件事是否正确。

以上是关于如何在 Asp.net 中使用 javascript 检测 IE 11的主要内容,如果未能解决你的问题,请参考以下文章

将 C# ASP.NET 数组传递给 Javascript 数组

在 ASP.NET MVC 视图中突出显示 javascript 文件的语法?

我没有从 ASP.NET MVC 中的控制器获取值

ASP.NET中Web网页的退出命令是啥?

asp.net 对话框弹不出来,怎么回事?

如何在 asp.net 中使用 ccavenue 支付网关