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

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

4

10 回答 10

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。

在极少数情况下,您实际上需要如上所述使用浏览器检测。在大多数情况下,特征检测方法是可取的

于 2013-11-25T19:45:22.447 回答
13
 isIE11 = !!window.MSStream;

 if(isIE11){
   /* Something */
 }
于 2013-10-25T09:04:03.453 回答
12

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

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

于 2013-11-08T20:42:33.860 回答
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;
                            }
于 2013-11-15T10:38:59.043 回答
3

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

在极少数情况下,可能需要唯一标识 IE11 预览版。使用Trident令牌这样做

用户代理字符串更改

对于许多旧网站,IE11 预览版的一些最明显的更新涉及用户代理字符串。以下是 Windows 8.1 Preview 上 IE11 Preview 的报告:JavaScript

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

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

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

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

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

于 2013-09-18T12:14:11.550 回答
1

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

if(navigator.appVersion.indexOf("MSIE") != -1 || navigator.appVersion.indexOf("Trident") != -1 || navigator.appVersion.indexOf("Edge") != -1){
// is IE
}
于 2015-07-03T23:28:31.757 回答
0

我最近使用以下代码来检测一般的 IE,它也适用于 IE 11

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

这个想法是寻找 vedor 前缀。

于 2014-01-05T06:24:20.383 回答
0

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

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

于 2014-08-21T18:46:36.923 回答
-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>
于 2013-12-14T21:41:05.600 回答
-10

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

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

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

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

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

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

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

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

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

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

于 2013-09-18T12:17:52.350 回答