【问题标题】:How can I determine which version of IE a user is running in JavaScript?如何确定用户在 JavaScript 中运行的 IE 版本?
【发布时间】:2008-11-11 13:32:38
【问题描述】:

在一些现有代码中,通过检查对象 Browser.Engine.trident 是否已定义并返回 true 来测试用户是否正在运行 IE。

但是如何确定用户运行的是 IE6(或更早版本)还是 IE7(或更高版本)?

需要在 JavaScript 函数中进行测试,因此条件注释似乎不合适。

【问题讨论】:

    标签: javascript internet-explorer browser


    【解决方案1】:

    来自detecting Internet Explorer More Effectively@msdn:

    function getInternetExplorerVersion()
    // Returns the version of Internet Explorer or a -1
    // (indicating the use of another browser).
    {
      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;
    }
    
    function checkVersion()
    {
      var msg = "You're not using Internet Explorer.";
      var ver = getInternetExplorerVersion();
    
      if ( ver > -1 )
      {
        if ( ver >= 6.0 ) 
          msg = "You're using a recent copy of Internet Explorer."
        else
          msg = "You should upgrade your copy of Internet Explorer.";
      }
      alert( msg );
    }
    

    【讨论】:

      【解决方案2】:

      如果您真的想确定您使用的是 IE 和特定版本,那么您显然可以使用 IE 的条件标签来仅在 IE 中运行某些代码。它不是真的那么漂亮,但至少你可以确定它是真正的 IE,而不是一些欺骗版本。

      <script>
          var isIE = false;
          var version = -1;
      </script>
      <!--[if IE 6]>
          <script>
              isIE = true;
              version = 6
          </script>
      <![endif]-->
      <!--[if IE 7]>
          <script>
              isIE = true;
              version = 7
          </script>
      <![endif]-->
      

      这很不言自明。在 IE6 中 isIEtrueversion6,在 IE7 中 isIEtrueversion7 否则 isIE@ 是 false 和 @98765433333 /p>

      或者,您可以使用从 jQuery 抄袭的代码推出自己的解决方案。

      var userAgent = navigator.userAgent.toLowerCase();
      var version = (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
      var isIE = /msie/.test( userAgent ) && !/opera/.test( userAgent ),    
      

      【讨论】:

      • 很抱歉错过了您说有条件的 cmets 不合适的帖子部分
      【解决方案3】:

      如果您已经在 1.9 之前的版本中使用 jQuery,并且不需要检测 IE 11,您可以这样做:

      if (jQuery.browser.msie == true) { 
      if (jQuery.browser.version == 7.0)
        // .. do something for 7.0
      else 
        // .. do something for < 7.0
      }
      

      【讨论】:

      • jQuery 很棒,但仅仅推荐它来做浏览器检查就有点过分了。另一方面,也许他需要一个充分的理由才能踏上大门。
      • 自动-1票投给SO JavaScript Question Disease,拖入数百行框架做一个琐碎的单行。
      • 我们很多人已经出于其他原因使用 jQuery,因此为这些问题提供框架答案很有用。如您所见,它比纯javascript解决方案要简洁得多。
      • 除非您的网站中已经有 jQuery(而谁没有),这使得这个答案成为迄今为止最好的答案。
      • jQuery.browser 在 1.3 版中已弃用,在 1.9.0 版中不再支持。如果升级到 1.9.0 并使用 jQuery.browser,它将不再工作。
      【解决方案4】:

      Navigator 对象包含有关用户浏览器的所有信息:

      例如:

      var browser=navigator.appName;

      var b_version=navigator.appVersion;

      var version=parseFloat(b_version);

      见:

      http://www.w3schools.com/js/js_browser.asp

      【讨论】:

      • 这很容易知道,但在这种情况下,navigator.appVersion 在 IE6 和 IE7 中都返回“4”,所以我不能用它来区分两者。不过还是谢谢。
      • 真的不再是真的了。例如,HTML5 表示 navigator.appName '必须返回字符串“Netscape”或浏览器的全名,例如“Mellblom Browsernator”' - 并且 appVersion 必须返回字符串“4.0”或详细表示浏览器版本的字符串,例如“1.0 (VMS; en-US) Mellblomenator/9000” - 因此对于任何符合 HTML5 的浏览器,此代码将返回 version = 4.0 或 1.0。
      【解决方案5】:

      如果您正在检查某个功能,您应该直接检查它,例如if (window.focus) {window.focus();} 浏览器检测永远不够可靠。

      有关对象与浏览器检测的更多详细信息,check out this article at Quirksmode

      另一方面,如果您需要的功能是浏览器类型和版本,例如出于统计目的,请使用 navigator.appNamenavigator.appVersion。 (但请注意 - 许多不太流行的浏览器将自己伪装成 MSIE 6 或 7,因为某些网站会在“所有现代浏览器都是 IE 的前提下阻止任何非 IE,对吗?”(提示:不再)。)

      【讨论】:

      • 这很好。虽然在这种情况下,对象的存在并不能告诉我这是 IE 6 还是 7。我需要知道如何解决 IE6 中的错误。
      【解决方案6】:

      因此,IE8 兼容性视图模式将自身报告为 IE7,即使它的行为并不总是相同。为此,我给你这个怪物:

          // IE8's "Compatibility mode" is anything but.  Oh well, at least it doesn't take 40 lines of code to detect and work around it.
      // Oh wait:
      /*
       * Author: Rob Reid
       * CreateDate: 20-Mar-09
       * Description: Little helper function to return details about IE 8 and its various compatibility settings either use as it is
       * or incorporate into a browser object. Remember browser sniffing is not the best way to detect user-settings as spoofing is
       * very common so use with caution.
      */
      function IEVersion(){
          var _n=navigator,_w=window,_d=document;
          var version="NA";
          var na=_n.userAgent;
          var ieDocMode="NA";
          var ie8BrowserMode="NA";
          // Look for msie and make sure its not opera in disguise
          if(/msie/i.test(na) && (!_w.opera)){
              // also check for spoofers by checking known IE objects
              if(_w.attachEvent && _w.ActiveXObject){        
                  // Get version displayed in UA although if its IE 8 running in 7 or compat mode it will appear as 7
                  version = (na.match( /.+ie\s([\d.]+)/i ) || [])[1];
                  // Its IE 8 pretending to be IE 7 or in compat mode        
                  if(parseInt(version)==7){                
                      // documentMode is only supported in IE 8 so we know if its here its really IE 8
                      if(_d.documentMode){
                          version = 8; //reset? change if you need to
                          // IE in Compat mode will mention Trident in the useragent
                          if(/trident\/\d/i.test(na)){
                              ie8BrowserMode = "Compat Mode";
                          // if it doesn't then its running in IE 7 mode
                          }else{
                              ie8BrowserMode = "IE 7 Mode";
                          }
                      }
                  }else if(parseInt(version)==8){
                      // IE 8 will always have documentMode available
                      if(_d.documentMode){ ie8BrowserMode = "IE 8 Mode";}
                  }
                  // If we are in IE 8 (any mode) or previous versions of IE we check for the documentMode or compatMode for pre 8 versions            
                  ieDocMode = (_d.documentMode) ? _d.documentMode : (_d.compatMode && _d.compatMode=="CSS1Compat") ? 7 : 5;//default to quirks mode IE5                               
              }
          }
      
          return {
              "UserAgent" : na,
              "Version" : version,
              "BrowserMode" : ie8BrowserMode,
              "DocMode": ieDocMode
          }            
      }
      var ieVersion = IEVersion();
      var IsIE8 = ieVersion.Version != "NA" && ieVersion.Version >= 8;
      

      【讨论】:

      • 这适用于具有以下标签的网站:&lt;meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7, IE=9"&gt;
      【解决方案7】:

      这可能会被否决,因为它没有直接回答问题,但是……您应该编写特定于浏览器的代码。在为大多数被广泛接受的浏览器编写代码时,几乎没有什么是您不能做的。

      编辑:我发现有条件 cmets 唯一有用的时候是我需要包含 ie6.css 或 ie7.css。

      【讨论】:

        【解决方案8】:

        嗯...这是我想了一会儿后想到的。只是想找到一个简单的解决方案。

        if (navigator.appName == 'Microsoft Internet Explorer') {
                // Take navigator appversion to an array & split it 
                var appVersion = navigator.appVersion.split(';');
                // Get the part that you want from the above array  
                var verNumber = appVersion[1];
        
                alert(verNumber);
        }
        

        它返回 ex:- MSIE 10.0、MSIE 9.0、MSIE 8.0

        进一步扩展,如果你想检查它是“低于”还是“高于”IE版本,你可以稍微修改一下

        if (navigator.appName == 'Microsoft Internet Explorer') {
                var appVersion = navigator.appVersion.split(';');
                var verNumber = appVersion[1];
                // Reaplce "MSIE " from the srting and parse it to integer value        
                var IEversion = parseInt(verNumber.replace('MSIE ', ''));
        
                if(IEversion <= 9){
                    alert(verNumber);
                }
        }
        

        w3schools 得到了基本的想法,希望这对某人有所帮助...:D

        【讨论】:

          【解决方案9】:

          这是我使用的脚本,它似乎运行良好:

          // Returns 0 if the browser is anything but IE
          function getIEVersion() {
             var ua = window.navigator.userAgent;
             var ie = ua.indexOf("MSIE ");
             return ((ie > 0) ? parseInt(ua.substring(ie+5, ua.indexOf(".", ie))) : 0);
          }
          

          希望对某人有所帮助...

          【讨论】:

            【解决方案10】:

            这应该会给你比你想要的更多的细节:

            var agent = navigator.userAgent;
            var msiePattern = /.*MSIE ((\d+).\d+).*/
            if( msiePattern.test( agent ) ) {
              var majorVersion = agent.replace(msiePattern,"$2");
              var fullVersion = agent.replace(msiePattern,"$1");
              var majorVersionInt = parseInt( majorVersion );
              var fullVersionFloat = parseFloat( fullVersion );
            }
            

            【讨论】:

              【解决方案11】:

              似乎还没有人说过:

              需要在 JavaScript 函数中进行测试,因此条件注释似乎不合适。

              您可以轻松地将条件注释 —  JScript 条件注释,而不是 HTML 注释 — 在函数中:

              function something() {
                  var IE_WIN= false;
                  var IE_WIN_7PLUS= false;
                  /*@cc_on
                  @if (@_win32)
                      IE_WIN= true;
                      @if (@_jscript_version>=5.7)
                          IE_WIN_7PLUS = true;
                      @end
                  @end @*/
                  ...
              }
              

              更典型的做法是在全局级别进行一次测试,然后只检查存储的标志。

              CC 比筛选用户代理字符串如今变得如此混乱更可靠。 navigator.userAgent 上的字符串匹配方法可能会误识别 Opera 等欺骗浏览器。

              当然,在可能的情况下,能力嗅探对于跨浏览器代码来说要好得多,但在某些情况下 — 通常是错误修复解决方法 — 您确实需要专门识别 IE,而 CC 可能是当今最好的方法。

              【讨论】:

                【解决方案12】:
                <script>
                    alert("It is " + isIE());
                
                    //return ie number as int else return false
                    function isIE() {
                        var myNav = navigator.userAgent.toLowerCase();
                        if (myNav.indexOf('msie') != -1) //ie less than ie11 (6-10)
                        {
                            return parseInt(myNav.split('msie')[1]);
                        }
                        else 
                        {
                            //Is the version more than ie11? Then return false else return ie int number
                            return (!!(myNav.match(/trident/) && !myNav.match(/msie/)) == false)?false : parseInt(myNav.split('rv:')[1].substring(0, 2));               
                        }
                    }
                </script>
                

                【讨论】:

                  猜你喜欢
                  • 2016-05-25
                  • 2016-01-31
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-09-18
                  相关资源
                  最近更新 更多