【问题标题】:Check if user is using IE检查用户是否使用 IE
【发布时间】:2019-10-15 22:05:42
【问题描述】:

我通过单击具有某个类的 div 来调用如下所示的函数。

如果用户正在使用 Internet Explorer,我是否可以在启动该功能时进行检查,如果他们正在使用其他浏览器则中止/取消它,以便它只为 IE 用户运行?这里的用户都是 IE8 或更高版本,所以我不需要介绍 IE7 和更低版本。

如果我能告诉他们正在使用哪个浏览器,那就太好了,但不是必需的。

示例函数:

$('.myClass').on('click', function(event)
{
    // my function
});

【问题讨论】:

  • 根据现代 Web 开发标准,从旧版本的 IE 开始开发是不好的做法。
  • 其实这种“坏习惯”是标准自己强加的,所以这不是开发者的错……浏览器的工作方式不同,而且规范在实现问题上过于软弱。为了制作出不出错且不无聊的东西,必须进行浏览器检测。我建议另一个最佳实践:With modern web development, it's bad practice to support non-Chromium-based browsers (with Safari not considered to be Chromium-based at all)。抱歉,但这种疯狂必须在某个时候以某种方式结束......
  • 今天最好的做法是进行“特征检测”而不是“浏览器检测”。询问浏览器是否满足您的需求。
  • @ChrisRogers - 这听起来很棒,但如果您因为bug in how IE measures the size of child elements of a flexbox element 而需要添加一些内联样式,那么是的......您需要浏览器检测。
  • @Chris - 道歉...意思是为了有更多的笑话语气。我要责怪 IE 偷走了我的快乐,让我感到痛苦和沮丧。 :)

标签: javascript jquery internet-explorer browser-detection


【解决方案1】:

几年后,Edge 浏览器现在使用 Chromium 作为其渲染引擎。
遗憾的是,检查 IE 11 仍然是一件事。

这是一个更直接的方法,因为旧版本的 IE 应该已经消失了。

if (window.document.documentMode) {
  // Do IE stuff
}

这是我的旧答案(2014 年):

在 Edge 中,用户代理字符串已更改。

/**
 * detect IEEdge
 * returns version of IE/Edge or false, if browser is not a Microsoft browser
 */
function detectIEEdge() {
    var ua = window.navigator.userAgent;

    var msie = ua.indexOf('MSIE ');
    if (msie > 0) {
        // IE 10 or older => return version number
        return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
    }

    var trident = ua.indexOf('Trident/');
    if (trident > 0) {
        // IE 11 => return version number
        var rv = ua.indexOf('rv:');
        return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
    }

    var edge = ua.indexOf('Edge/');
    if (edge > 0) {
       // Edge => return version number
       return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
    }

    // other browser
    return false;
}

示例用法:

alert('IEEdge ' + detectIEEdge());

IE 10 的默认字符串:

Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)

IE 11 的默认字符串:

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

Edge 12 的默认字符串:

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0 

Edge 13 的默认字符串(感谢 @DrCord):

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586 

Edge 14 的默认字符串:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/14.14300 

Edge 15 的默认字符串:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063 

Edge 16 的默认字符串:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299 

Edge 17 的默认字符串:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134 

Edge 18 的默认字符串(内幕预览):

Mozilla/5.0 (Windows NT 10.0; Win64; x64; ServiceUI 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17730 

在 CodePen 测试:

http://codepen.io/gapcode/pen/vEJNZN

【讨论】:

  • 感谢您的评论。我还没有验证你的答案,但我想评论一件事:因为第一个“if”包含一个“return”,所以之后你不需要一个“else”。
  • 只是好奇,他们为什么要在新版本的 IE 中更改用户代理行? MS 真的不希望我们检测到他们糟糕的网络浏览器。
  • @SameerAlibhai 这在理论上听起来不错,但在实践中,尤其是目前,它并不实用。有时会出现单个“功能”检测不包含的问题,并且某些功能具有实现怪癖,只能在了解浏览器的情况下才能解决。如果我想做一些简单的事情,比如收集浏览器统计信息,该怎么办?
  • 应该注意的是,Edge 并不是真正的“IE12”,而是一个完全独立的浏览器。 Windows 10 同时安装了 IE11 和 Edge。
  • 我对IE的仇恨越来越大
【解决方案2】:

使用下面的 JavaScript 方法:

function msieversion() 
{
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

    if (msie > 0) // If Internet Explorer, return version number
    {
        alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
    }
    else  // If another browser, return 0
    {
        alert('otherbrowser');
    }

    return false;
}

您可以在以下 Microsoft 支持网站上找到详细信息:

How to determine browser version from script

更新:(IE 11 支持)

function msieversion() {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

    if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))  // If Internet Explorer, return version number
    {
        alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
    }
    else  // If another browser, return 0
    {
        alert('otherbrowser');
    }

    return false;
}

【讨论】:

  • 虽然这会很好,因为 ua 变量永远不会以 MSIE 开头,但写 if (msie > 0) 会产生误导。如果未找到该值,则 indexOf() 函数返回 -1 而不是 0。因此 if (msie > -1) 将更具解释性。
  • 这在 IE11 中返回 NaN,对我来说。
  • @verism 和其他人:检查这个也适用于IE 11 的答案:stackoverflow.com/a/21712356/114029
  • navigator.userAgent.indexOf("MSIE") > 0 || navigator.userAgent.indexOf("Trident") > 0 || navigator.userAgent.indexOf("Edge") > 0
  • /Edge\/|Trident\/|MSIE /.test(window.navigator.userAgent) 我知道这适用于 10 和 11。如果您可以验证
【解决方案3】:

如果您只想知道浏览器是否为 IE,您可以这样做:

var isIE = false;
var ua = window.navigator.userAgent;
var old_ie = ua.indexOf('MSIE ');
var new_ie = ua.indexOf('Trident/');

if ((old_ie > -1) || (new_ie > -1)) {
    isIE = true;
}

if ( isIE ) {
    //IE specific code goes here
}

更新 1:更好的方法

我现在推荐这个。它仍然非常可读,而且代码少得多:)

var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident/.test(ua);

if ( isIE ) {
  //IE specific code goes here
}

感谢 cmets 中的 JohnnyFun 的简短回答 :)

更新 2:在 CSS 中测试 IE

首先,如果可以的话,你应该使用@supports语句而不是JS来检查浏览器是否支持某个CSS特性。

.element {
  /* styles for all browsers */
}

@supports (display: grid) {
  .element {
    /* styles for browsers that support display: grid */
  }
}

(请注意,IE 根本不支持@supports,并且会忽略放在@supports 语句中的任何样式。)

如果问题无法通过@supports 解决,那么您可以这样做:

// JS

var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident/.test(ua);

if ( isIE ) {
  document.documentElement.classList.add('ie')
}
/* CSS */

.element {
  /* styles that apply everywhere */
}

.ie .element {
  /* styles that only apply in IE */
}

(注意:classList 对 JS 来说相对较新,我认为,在 IE 浏览器中,它只适用于 IE11。可能也适用于 IE10。)

如果您在项目中使用 SCSS (Sass),则可以简化为:

/* SCSS (Sass) */

.element {
  /* styles that apply everywhere */

  .ie & {
    /* styles that only apply in IE */
  }
}

更新 3:添加 Microsoft Edge(不推荐)

如果您还想将 Microsoft Edge 添加到列表中,可以执行以下操作。但是我不推荐它,因为 Edge 是一个比 IE 更强大的浏览器。

var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident|Edge\//.test(ua);

if ( isIE ) {
  //IE & Edge specific code goes here
}

【讨论】:

  • 或相同的几个字节:ms_ie = ~ua.indexOf('MSIE') || ~ua.indexOf('Trident/'); ;-)
  • 我的版本虽然对人类来说更直接,但更少的字节总是好的:)
  • ms_ie = !!ua.match(/MSIE|Trident/)
  • 或 ms_ie = /MSIE|Trident/.test(ua)
  • @SimonSteinberger ~ 有什么意义吗?
【解决方案4】:

对于任何版本的 Internet Explorer,这都会返回 true

function isIE(userAgent) {
  userAgent = userAgent || navigator.userAgent;
  return userAgent.indexOf("MSIE ") > -1 || userAgent.indexOf("Trident/") > -1 || userAgent.indexOf("Edge/") > -1;
}

userAgent 参数是可选的,默认为浏览器的用户代理。

【讨论】:

  • 这应该很好,但是您基本上忘记为 IE 浏览器设置默认的“return true”或“return 1”值。当检测到 IE 浏览器时,当前不会返回任何值。
  • 为什么要将 Edge 视为 IE?在兼容性方面,它们现在几乎没有共同之处。
  • @docta_faustus userAgent 是一个参数,而不是全局
【解决方案5】:

您可以使用 navigator 对象来检测 user-navigator,您不需要 jquery,下面的 4 个 cmets 已经包含,所以这个 sn-p 可以正常工作

if (/MSIE (\d+\.\d+);/.test(navigator.userAgent) || navigator.userAgent.indexOf("Trident/") > -1 ){ 
 // Do stuff with Internet-Exploders ... :)
}

http://www.javascriptkit.com/javatutors/navigator.shtml

【讨论】:

  • 这给我的 IE11 错误
  • IE11 的用户代理不同于 MSIE (X.X);通过检查 Trident 可以找到 IE11。
  • 这会在 Firefox 45.0.2 中产生误报。
  • 错误的测试 indexOf 不要像测试函数正则表达式那样返回 true 或 false 你有做 navigator.userAgent.indexOf("Trident/") != -1
【解决方案6】:

Angularjs 团队就是这样做的 (v 1.6.5):

var msie, // holds major version number for IE, or NaN if UA is not IE.

// Support: IE 9-11 only
/**
 * documentMode is an IE-only property
 * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
 */
msie = window.document.documentMode;

然后有几行代码分散在整个使用它作为一个数字,例如

if (event === 'input' && msie <= 11) return false;

if (enabled && msie < 8) {

【讨论】:

  • window.document.documentMode 在 MS Edge 中未定义
  • 它在 MS Edge 中未定义,因为 MS Edge 不是 IE!
  • document.documentMode 受 IE8+ 支持。 Edge 或 Chrome/FireFox 将是 'undefined'...。我将此代码更改为var IEver = window.document.documentMode || (window.attachEvent? 1 : 99);,这样它就可以为 IE8+ 返回准确的 IE 版本,为非 IE 浏览器返回 99(通常是现代浏览器),为旧的 IE5-7 返回 1。之所以这样写,是因为我们通常只需要对一些较旧的 IE 进行特殊处理。所以,if (IEver &lt; 9) { ... } 表示如果它是旧的 IE
【解决方案7】:

方法01:
$.browser 在 jQuery 版本 1.3 中被弃用并在 1.9 中被删除

if ( $.browser.msie) {
  alert( "Hello! This is IE." );
}

方法02:
使用条件注释

<!--[if gte IE 8]>
<p>You're using a recent version of Internet Explorer.</p>
<![endif]-->

<!--[if lt IE 7]>
<p>Hm. You should upgrade your copy of Internet Explorer.</p>
<![endif]-->

<![if !IE]>
<p>You're not using Internet Explorer.</p>
<![endif]>

方法03:

 /**
 * Returns the version of Internet Explorer or a -1
 * (indicating the use of another browser).
 */
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;
}

function checkVersion()
{
    var msg = "You're not using Internet Explorer.";
    var ver = getInternetExplorerVersion();

    if ( ver > -1 )
    {
        if ( ver >= 8.0 ) 
            msg = "You're using a recent copy of Internet Explorer."
        else
            msg = "You should upgrade your copy of Internet Explorer.";
    }

    alert( msg );
}

方法04:
使用 JavaScript/手动检测

/*
     Internet Explorer sniffer code to add class to body tag for IE version.
     Can be removed if your using something like Modernizr.
 */
 var ie = (function ()
 {

     var undef,
     v = 3,
         div = document.createElement('div'),
         all = div.getElementsByTagName('i');

     while (
     div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i>< ![endif]-->',
     all[0]);

     //append class to body for use with browser support
     if (v > 4)
     {
         $('body').addClass('ie' + v);
     }

 }());

Reference Link

【讨论】:

  • @radhe 我已经更新了答案,希望这对你有用。
  • 注意:方法 2 在标准模式下无法在 IE10 或更高版本中运行。欲了解更多信息:Conditional comments are no longer supported
  • @insertusernamehere 你是对的,因为我认为如果你只为 ie10 做一些 css 修复,我认为使用 .ie10 类是最好的选择之一。由于 Internet Explorer 10 将 ".ie10" 类添加到 HTML 元素 &lt;html class="ie10"&gt;,因此您可以像 .ie10 .myclass {//some css here} 一样使用它
【解决方案8】:

使用上面的答案;简单而简洁的返回布尔值:

var isIE = /(MSIE|Trident\/|Edge\/)/i.test(navigator.userAgent);

【讨论】:

  • 在 Widnows 10 上的 FireFox 44.0.2 中返回 false。什么版本的 FireFox 返回 true @SiKni8?
【解决方案9】:

您可以这样做:

var isIE = window.document.documentMode ? true : false; // this variable will hold if the current browser is IE

我知道这个问题很老,但是如果有人滚动到那么远,他们可以看到简单的答案:)

【讨论】:

    【解决方案10】:

    我只是想检查浏览器是否为 IE11 或更旧版本,因为它们很垃圾。

    function isCrappyIE() {
        var ua = window.navigator.userAgent;
        var crappyIE = false;
        var msie = ua.indexOf('MSIE ');
        if (msie > 0) {// IE 10 or older => return version number        
            crappyIE = true;
        }
        var trident = ua.indexOf('Trident/');
        if (trident > 0) {// IE 11 => return version number        
            crappyIE = true;
        }
        return crappyIE;
    }   
    
    if(!isCrappyIE()){console.table('not a crappy browser);}
    

    【讨论】:

    • 这让我投票赞成它高度重视命名约定标准
    【解决方案11】:
    function detectIE() {
        var ua = window.navigator.userAgent;
        var ie = ua.search(/(MSIE|Trident|Edge)/);
    
        return ie > -1;
    }
    

    【讨论】:

    • 不回答问题。 Edge 不是 IE。
    • hda,问题从 2013 年开始,我认为今天,有趣的是不要忽略“Edge”
    【解决方案12】:

    或者这个非常短的版本,如果浏览器是 Internet Explorer,则返回 true:

    function isIe() {
        return window.navigator.userAgent.indexOf("MSIE ") > 0
            || !!navigator.userAgent.match(/Trident.*rv\:11\./);
    }
    

    【讨论】:

      【解决方案13】:

      使用modernizr

      Modernizr.addTest('ie', function () {
          var ua = window.navigator.userAgent;
          var msie = ua.indexOf('MSIE ') > 0;
          var ie11 = ua.indexOf('Trident/') > 0;
          var ie12 = ua.indexOf('Edge/') > 0;
          return msie || ie11 || ie12;
      });
      

      【讨论】:

      • 不回答这个问题,因为 Edge 不是 IE。 Edge 也不是 IE12。当基于 Chromium 的 Edge 发布时,您还应该将 Chrome 或 Opera 添加到此列表中。 (无论你想通过这个实现什么,那么检测 Firefox 会更容易)
      【解决方案14】:

      另一个简单(但人类可读)的功能,用于检测浏览器是否为 IE(忽略 Edge,一点也不差):

      function isIE() {
        var ua = window.navigator.userAgent;
        var msie = ua.indexOf('MSIE '); // IE 10 or older
        var trident = ua.indexOf('Trident/'); //IE 11
      
        return (msie > 0 || trident > 0);
      }
      

      【讨论】:

        【解决方案15】:

        如果您不想使用用户代理,您也可以这样做来检查浏览器是否为 IE。注释代码实际运行在 IE 浏览器中,将“false”变为“true”。

        var isIE = /*@cc_on!@*/false;
        if(isIE){
            //The browser is IE.
        }else{
            //The browser is NOT IE.
        }   
        

        【讨论】:

        • IE11 不支持条件编译
        • 我刚试过这个,它仍然有效。确定不支持?
        【解决方案16】:

        我知道这是一个老问题,但如果有人再次遇到它并在检测 IE11 时遇到问题,这里有一个适用于所有当前版本 IE 的有效解决方案。

        var isIE = false;
        if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
            isIE = true;   
        }
        

        【讨论】:

          【解决方案17】:

          如果您使用的是 jquery 版本 >=1.9,请尝试此操作,

          var browser;
          jQuery.uaMatch = function (ua) {
              ua = ua.toLowerCase();
          
              var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
                  /(webkit)[ \/]([\w.]+)/.exec(ua) ||
                  /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
                  /(msie) ([\w.]+)/.exec(ua) || 
                  ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
                 /(Trident)[\/]([\w.]+)/.exec(ua) || [];
          
              return {
                  browser: match[1] || "",
                  version: match[2] || "0"
              };
          };
          // Don't clobber any existing jQuery.browser in case it's different
          if (!jQuery.browser) {
              matched = jQuery.uaMatch(navigator.userAgent);
              browser = {};
          
              if (matched.browser) {
                  browser[matched.browser] = true;
                  browser.version = matched.version;
              }
          
              // Chrome is Webkit, but Webkit is also Safari.
              if (browser.chrome) {
                  browser.webkit = true;
              } else if (browser.webkit) {
                  browser.safari = true;
              }
          
              jQuery.browser = browser;
          }
          

          如果使用 jQuery 版本 (在 jQuery 1.9 中删除了 $.browser),请改用以下代码:

          $('.myClass').on('click', function (event) {
              if ($.browser.msie) {
                  alert($.browser.version);
              }
          });
          

          【讨论】:

          • 谢谢。不幸的是,我们仍在使用 1.7.2 版本,还无法更改。
          • 据我所知,这并没有考虑到基于 Trident 引擎的较新的 IE。
          • 针对基于 Trident 的最新 IE 更新
          【解决方案18】:

          我用过这个

          function notIE(){
              var ua = window.navigator.userAgent;
              if (ua.indexOf('Edge/') > 0 || 
                  ua.indexOf('Trident/') > 0 || 
                  ua.indexOf('MSIE ') > 0){
                 return false;
              }else{
                  return true;                
              }
          }
          

          【讨论】:

            【解决方案19】:

            亡灵术。

            为了不依赖于用户代理字符串,只需检查几个属性:

            if (document.documentMode) 
            {
                console.log('Hello Microsoft IE User!');
            }
            
            if (!document.documentMode && window.msWriteProfilerMark) {
                console.log('Hello Microsoft Edge User!');
            }
            
            if (document.documentMode || window.msWriteProfilerMark) 
            {
                console.log('Hello Microsoft User!');
            }
            
            if (window.msWriteProfilerMark) 
            {
                console.log('Hello Microsoft User in fewer characters!');
            }
            

            此外,这会检测到新的 Chredge/Edgium (Anaheim):

            function isEdg()
            { 
            
                for (var i = 0, u="Microsoft", l =u.length; i < navigator.plugins.length; i++)
                {
                    if (navigator.plugins[i].name != null && navigator.plugins[i].name.substr(0, l) === u)
                        return true;
                }
            
                return false;
            }
            

            这会检测到铬:

            function isChromium()
            { 
            
                for (var i = 0, u="Chromium", l =u.length; i < navigator.plugins.length; i++)
                {
                    if (navigator.plugins[i].name != null && navigator.plugins[i].name.substr(0, l) === u)
                        return true;
                }
            
                return false;
            }
            

            还有这个 Safari:

            if(window.safari)
            {
                console.log("Safari, yeah!");
            }
            

            【讨论】:

              【解决方案20】:

              @SpiderCode 的解决方案不适用于 IE 11。这是我以后在我的代码中使用的最佳解决方案,我需要针对特定​​功能进行浏览器检测。

              IE11 不再报告为 MSIE,根据此更改列表,这是有意避免错误检测。

              如果你真的想知道它是 IE,你可以做的是检测用户代理中的 Trident/ 字符串,如果 navigator.appName 返回 Netscape,类似于(未测试的);

              感谢this answer

              function isIE()
              {
                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 == -1 ? false: true;
              }
              

              【讨论】:

                【解决方案21】:

                这里有很多答案,我想补充一下我的意见。 IE 11 在 flexbox 方面是如此糟糕(查看它的所有问题和不一致here),我真的需要一种简单的方法来检查用户是否使用任何 IE 浏览器(包括 11 在内)但不包括 Edge,因为 Edge其实挺好看的。

                根据此处给出的答案,我编写了一个简单的函数,返回一个全局布尔变量,然后您可以使用该变量。检查 IE 非常容易。

                var isIE;
                (function() {
                    var ua = window.navigator.userAgent,
                        msie = ua.indexOf('MSIE '),
                        trident = ua.indexOf('Trident/');
                
                    isIE = (msie > -1 || trident > -1) ? true : false;
                })();
                
                if (isIE) {
                    alert("I am an Internet Explorer!");
                }
                

                这样您只需进行一次查找,并将结果存储在变量中,而不必在每次函数调用时获取结果。 (据我所知,您甚至不必等待文档准备好执行此代码,因为用户代理与 DOM 无关。)

                【讨论】:

                  【解决方案22】:

                  我在下面找到了在谷歌搜索时执行此操作的优雅方式 ---

                  / detect IE
                  var IEversion = detectIE();
                  
                  if (IEversion !== false) {
                    document.getElementById('result').innerHTML = 'IE ' + IEversion;
                  } else {
                    document.getElementById('result').innerHTML = 'NOT IE';
                  }
                  
                  // add details to debug result
                  document.getElementById('details').innerHTML = window.navigator.userAgent;
                  
                  /**
                   * detect IE
                   * returns version of IE or false, if browser is not Internet Explorer
                   */
                  function detectIE() {
                    var ua = window.navigator.userAgent;
                  
                    // Test values; Uncomment to check result …
                  
                    // IE 10
                    // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';
                  
                    // IE 11
                    // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';
                  
                    // IE 12 / Spartan
                    // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';
                  
                    // Edge (IE 12+)
                    // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586';
                  
                    var msie = ua.indexOf('MSIE ');
                    if (msie > 0) {
                      // IE 10 or older => return version number
                      return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
                    }
                  
                    var trident = ua.indexOf('Trident/');
                    if (trident > 0) {
                      // IE 11 => return version number
                      var rv = ua.indexOf('rv:');
                      return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
                    }
                  
                    var edge = ua.indexOf('Edge/');
                    if (edge > 0) {
                      // Edge (IE 12+) => return version number
                      return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
                    }
                  
                    // other browser
                    return false;
                  }
                  

                  【讨论】:

                  • 这正是来自my pen at CodePen 的代码,它是my answer to this question 的一部分。 ;-)
                  • 是的,我使用了相同但堆栈溢出的人不想共享链接。将在此处更新参考链接。感谢马里奥的出色工作。
                  【解决方案23】:

                  更新 SpiderCode 的答案以解决字符串“MSIE”返回 -1 但匹配“Trident”的问题。它曾经返回 NAN,但现在为那个版本的 IE 返回 11。

                     function msieversion() {
                         var ua = window.navigator.userAgent;
                         var msie = ua.indexOf("MSIE ");
                         if (msie > -1) {
                             return ua.substring(msie + 5, ua.indexOf(".", msie));
                         } else if (navigator.userAgent.match(/Trident.*rv\:11\./)) {
                             return 11;
                         } else {
                             return false;
                         }
                      }
                  

                  【讨论】:

                    【解决方案24】:

                    我在 2020 年登陆这个页面,我看到直到 IE5 所有 userAgent 字符串都有Trident,我不确定他们是否有任何改变。所以只在 userAgent 中检查 Trident 对我有用。

                    var isIE = navigator.userAgent.indexOf('Trident') > -1;
                    

                    【讨论】:

                      【解决方案25】:

                      这是另一种无需查看用户代理即可检测 IE 的方法:

                      var usingIE="__IE_DEVTOOLBAR_CONSOLE_EVAL_ERROR" in document;
                      alert("You are"+(usingIE?"":"n't")+" using Internet Explorer.");

                      我在测试我的网站是否在 IE 上运行时偶然发现了这个,然后我转到调试器并单击了文件夹图标。它有我的脚本,还有一个我没有的Dynamic Scripts 文件夹。我打开它,发现很多browsertools.library.js 文件。在里面我发现了类似的东西:

                      document.__IE_DEVTOOLBAR_CONSOLE_EVAL_RESULT = undefined;
                      document.__IE_DEVTOOLBAR_CONSOLE_EVAL_ERROR = false;
                      document.__IE_DEVTOOLBAR_CONSOLE_EVAL_ERRORCODE = undefined;
                      try{
                      document.__IE_DEVTOOLBAR_CONSOLE_EVAL_RESULT = eval("\r\n//# sourceURL=browsertools://browsertools.library.js");
                      }
                      catch( eObj ){
                      document.__IE_DEVTOOLBAR_CONSOLE_EVAL_ERRORCODE = eObj.number;
                      document.__IE_DEVTOOLBAR_CONSOLE_EVAL_RESULT = eObj.message || eObj.description || eObj.toString();
                      document.__IE_DEVTOOLBAR_CONSOLE_EVAL_ERROR = true;
                      }
                      

                      所以我用这些来测试用户的浏览器是否是 IE。请注意,这仅在您想知道他们是否有 IE 时才有效,而不是他们拥有的 IE 版本。

                      【讨论】:

                        【解决方案26】:

                        您可以检测所有 Internet Explorer(测试的最新版本 12)。

                        <script>
                            var $userAgent = '';
                            if(/MSIE/i['test'](navigator['userAgent'])==true||/rv/i['test'](navigator['userAgent'])==true||/Edge/i['test'](navigator['userAgent'])==true){
                               $userAgent='ie';
                            } else {
                               $userAgent='other';
                            }
                        
                            alert($userAgent);
                        </script>
                        

                        请看这里https://jsfiddle.net/v7npeLwe/

                        【讨论】:

                          【解决方案27】:
                          function msieversion() {
                          var ua = window.navigator.userAgent;
                          console.log(ua);
                          var msie = ua.indexOf("MSIE ");
                          
                          if (msie > -1 || navigator.userAgent.match(/Trident.*rv:11\./)) { 
                              // If Internet Explorer, return version numbe
                              // You can do what you want only in IE in here.
                              var version_number=parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)));
                              if (isNaN(version_number)) {
                                  var rv_index=ua.indexOf("rv:");
                                  version_number=parseInt(ua.substring(rv_index+3,ua.indexOf(".",rv_index)));
                              }
                              console.log(version_number);
                          } else {       
                              //other browser   
                              console.log('otherbrowser');
                          }
                          }
                          

                          您应该在控制台中看到结果,请使用 chrome Inspect。

                          【讨论】:

                            【解决方案28】:

                            我已将此代码放在文档就绪函数中,它仅在 Internet Explorer 中触发。在 Internet Explorer 11 中测试。

                            var ua = window.navigator.userAgent;
                            ms_ie = /MSIE|Trident/.test(ua);
                            if ( ms_ie ) {
                                //Do internet explorer exclusive behaviour here
                            }
                            

                            【讨论】:

                              【解决方案29】:

                              这仅适用于 IE 11 版本以下。

                              var ie_version = parseInt(window.navigator.userAgent.substring(window.navigator.userAgent.indexOf("MSIE ") + 5, window.navigator.userAgent.indexOf(".", window.navigator.userAgent.indexOf("MSIE "))));
                              

                              console.log("version number",ie_version);

                              【讨论】:

                                【解决方案30】:

                                检测 Internet Explorer 或 Edge 版本的 JavaScript 函数

                                function ieVersion(uaString) {
                                  uaString = uaString || navigator.userAgent;
                                  var match = /\b(MSIE |Trident.*?rv:|Edge\/)(\d+)/.exec(uaString);
                                  if (match) return parseInt(match[2])
                                }
                                

                                【讨论】:

                                  猜你喜欢
                                  • 2012-04-18
                                  • 1970-01-01
                                  • 2017-07-25
                                  • 2015-02-23
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2017-06-18
                                  • 2015-08-26
                                  相关资源
                                  最近更新 更多