在JavaScript中检测IE版本(v9之前)

253

如果用户使用早于v9的Internet Explorer版本,我希望将其反弹到错误页面,因为我们不值得花时间和金钱来支持IE pre-v9。其他非IE浏览器的用户都可以正常使用且无需反弹。这是建议的代码:

if(navigator.appName.indexOf("Internet Explorer")!=-1){     //yeah, he's using IE
    var badBrowser=(
        navigator.appVersion.indexOf("MSIE 9")==-1 &&   //v9 is ok
        navigator.appVersion.indexOf("MSIE 1")==-1  //v10, 11, 12, etc. is fine too
    );

    if(badBrowser){
        // navigate to error page
    }
}

这段代码能实现吗?

在此之前,我想先回应几个可能会出现的评论:

  1. 是的,我知道用户可以伪造他们的 useragent 字符串,但我并不担心。
  2. 是的,我知道编程专家更喜欢检测特性支持而不是浏览器类型,但我认为这种方法在这种情况下并不合理。我已经知道所有(相关的)非 IE 浏览器都支持我需要的功能,而所有的 pre-v9 IE 浏览器都不支持。在整个站点逐个检查每个特性将是一种浪费。
  3. 是的,我知道有人试图使用 IE v1(或 >= 20)来访问网站将不会将 'badBrowser' 设置为 true 并且警告页面将无法正常显示。我们愿意承担这种风险。
  4. 是的,我知道 Microsoft 有 "条件注释" 可以用于精确的浏览器版本检测。但自从 IE 10 起,IE 就不再支持条件注释了,使这种方法变得绝对无用。

还有其他显而易见的问题需要注意吗?


125
“支持IE v9之前的版本不值得我们浪费时间和金钱。” 我很希望我能够做到。 - user377628
2
基于第二点,我不建议使用Modernizr(http://en.wikipedia.org/wiki/Modernizr)-每个人都必须在某个地方划定界限-但是IE9似乎是一个高标准。 - amelvin
1
条件注释只是普通的注释。只有IE将它们解释为特殊注释。IE10+不再这样做了。 - Andreas
3
IE 10将与非IE浏览器一样处理条件注释。它们是有效的HTML注释,将被视为这样的注释。我同意Andreas的看法,并认为条件注释是可行的方法。 - Tim Down
1
谁在乎IE10是否支持条件注释,如果它不是你要检测的浏览器之一?你不需要检测它是否是IE9或更高版本,你只需要检测它是否是IE8或更低版本。你的错误在于认为你需要弄清楚它是什么,才能知道它不是什么。这是不正确的。你不需要检测IE10,你只需要知道它不是IE8(或更低版本)。任何你放在lt IE 9条件中的代码都将在IE8及以下版本中运行,而其他地方则不会。就是这么简单。这是微软在IE方面做对的唯一一件事情。 - Jimbo Jonny
显示剩余5条评论
37个回答

1

我建议您不要再重写此代码。我建议您使用Conditionizr库(http://conditionizr.com/),该库可以测试特定的IE版本以及其他浏览器、操作系统,甚至Retina显示屏的存在或缺失。

仅包含您需要的特定测试代码,并且您还可以获得已经经过许多迭代测试的库的好处(并且易于升级而不会破坏您的代码)。

它也与Modernizr很好地配合使用,Modernizr可以处理所有情况,其中测试特定功能优于测试特定浏览器。


1
我找到的最全面的检查IE版本的JS脚本是http://www.pinlady.net/PluginDetect/IE/。整个库位于http://www.pinlady.net/PluginDetect/Browsers/
随着IE10的推出,条件语句不再被支持。
随着IE11的推出,用户代理不再包含MSIE。此外,使用用户代理是不可靠的,因为它可以被修改。
使用PluginDetect JS脚本,您可以检测IE并通过使用特定于特定IE版本的非常具体和精心制作的代码来检测确切的版本。当您关心您正在使用哪个浏览器版本时,这非常有用。

1

我喜欢那个:

<script>
   function isIE () {
       var myNav = navigator.userAgent.toLowerCase();
       return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
   }    
   var ua = window.navigator.userAgent;
   //Internet Explorer | if | 9-11

   if (isIE () == 9) {
       alert("Shut down this junk! | IE 9");
   } else if (isIE () == 10){
       alert("Shut down this junk! | IE 10");
   } else if (ua.indexOf("Trident/7.0") > 0) {
       alert("Shut down this junk! | IE 11");
   }else{
       alert("Thank god it's not IE!");
   }

</script>

1
我意识到自己来晚了,但我一直在查找一种简单的方式来提供反馈,以确定浏览器是否为IE以及其版本从10到更低。我尚未为版本11编写此代码,因此可能需要进行一些修改。
然而,这就是代码,它作为一个具有属性和方法的对象工作,并依赖于对象检测而不是获取导航器对象(这是极其有缺陷的,因为它可以被欺骗)。
var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

使用isIE.browser属性返回布尔值,并依赖于条件注释方法isIE.detectedVersion(),该方法返回5到10之间的数字。我假设低于6的任何版本都属于严重老派领域,您需要比一行更强大的东西,而高于10的任何版本都属于较新领域。我已经阅读了关于IE11不支持条件注释的内容,但我还没有完全调查,这可能是以后的事情。

无论如何,就目前而言,对于一行代码,它将涵盖IE浏览器和版本检测的基础知识。它远非完美,但它很小并且容易修改。

仅供参考,如果有人对如何实际实现此操作有疑问,则以下条件应该有所帮助。

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

/* testing IE */

if (isIE.browser) {
  alert("This is an IE browser, with a detected version of : " + isIE.detectedVersion());
}

1
这种检测IE的方法结合了jKey使用条件注释和Owen使用用户代理的优点,避免了它们的弱点。
  • jKey's approach works up to version 9 and immune to user agent spoofing in IE 8 & 9.
  • Owen's approach can fail on IE 5 & 6 (reporting 7) and is susceptible to UA spoofing, but it can detect IE versions >= 10 (now also including 12, which postdates Owen's answer).

    // ----------------------------------------------------------
    // A short snippet for detecting versions of IE
    // ----------------------------------------------------------
    // If you're not in IE (or IE version is less than 5) then:
    //     ie === undefined
    // Thus, to detect IE:
    //     if (ie) {}
    // And to detect the version:
    //     ie === 6 // IE6
    //     ie > 7 // IE8, IE9 ...
    // ----------------------------------------------------------
    var ie = (function(){
        var v = 3,
            div = document.createElement('div'),
            all = div.getElementsByTagName('i');
    
        while (
            div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
            all[0]
        );
        if (v <= 4) { // Check for IE>9 using user agent
            var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:|Edge\/)(\d+)/);
            v = match ? parseInt(match[1]) : undefined;
        }
        return v;
    }());
    
这可以用于为包含IE版本的文档设置有用的类:
    if (ie) {
        document.documentElement.className += ' ie' + ie;
        if (ie < 9)
            document.documentElement.className += ' ieLT9';
    }

请注意,如果IE处于兼容模式下,它会检测到正在使用的兼容性模式。还要注意,IE版本对于旧版本(<10)非常有用;更高版本更符合标准,最好使用类似modernizr.js的东西来检查功能。

0
if (!document.addEventListener) {
    // ie8
} else if (!window.btoa) {
    // ie9
}
// others

0

运行IE10的Windows将自动更新为IE11+,并将符合W3C标准。

现在,我们不需要支持IE8及以下版本。

    <!DOCTYPE html>
    <!--[if lt IE 9]><html class="ie ie8"><![endif]-->
    <!--[if IE 9]><html class="ie ie9"><![endif]-->
    <!--[if (gt IE 9)|!(IE)]><!--><html><!--<![endif]-->
    <head>
        ...
        <!--[if lt IE 8]><meta http-equiv="Refresh" content="0;url=/error-browser.html"><![endif]--
        ...
    </head>

0

如果您需要检测IE浏览器版本,则可以按照以下代码进行操作。此代码适用于IE6到IE11版本。

<!DOCTYPE html>
<html>
<body>

<p>Click on Try button to check IE Browser version.</p>

<button onclick="getInternetExplorerVersion()">Try it</button>

<p id="demo"></p>

<script>
function getInternetExplorerVersion() {
   var ua = window.navigator.userAgent;
        var msie = ua.indexOf("MSIE ");
        var rv = -1;

        if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))      // If Internet Explorer, return version number
        {               
            if (isNaN(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))))) {
                //For IE 11 >
                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);
                        alert(rv);
                    }
                }
                else {
                    alert('otherbrowser');
                }
            }
            else {
                //For < IE11
                alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
            }
            return false;
        }}
</script>

</body>
</html>

0

它帮助了我

function IsIE8Browser() {
  var rv = -1;
  var ua = navigator.userAgent;
  var re = new RegExp("Trident\/([0-9]{1,}[\.0-9]{0,})");
  if (re.exec(ua) != null) {
    rv = parseFloat(RegExp.$1);
  }
  return (rv == 4);
}

0
function getIEVersion(){
     if (/MSIE |Trident\//.test( navigator.userAgent )=== false) return -1;
    /**[IE <=9]*/
    var isIE9L = typeof ( window.attachEvent ) === 'function' && !( Object.prototype.toString.call( window.opera ) == '[object Opera]' ) ? true : false;
    var re;
    if(isIE9L){
        re = new RegExp( "MSIE ([0-9]{1,}[\.0-9]{0,})" );
        if(re.exec( navigator.userAgent ) !== null)
            return parseFloat( RegExp.$1 );
        return -1;
    }
    /**[/IE <=9]*/
    /** [IE >= 10]*/
    if(navigator.userAgent.indexOf( 'Trident/' ) > -1){
        re = new RegExp( "rv:([0-9]{1,}[\.0-9]{0,})" );
        if(re.exec( navigator.userAgent ) !== null)
            return parseFloat( RegExp.$1 );
        return -1;
    }
    /**[/IE >= 10]*/
    return -1;
};

在这里检查 ==>

var ieVersion = getIEVersion();

if(ieVersion < 0){
    //Not IE
}
//A version of IE

了解有关浏览器导航器的更多信息 https://developer.mozilla.org/zh-CN/docs/Web/API/Window/navigator


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