【问题标题】:Internet Explorer 11 detectionInternet Explorer 11 检测
【发布时间】:2019-11-20 03:22:14
【问题描述】:

我知道 IE 11 的用户代理字符串与所有其他 IE 不同

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

我已尝试检测 IE 11 并为此问题指定答案'

Jquery fail to detect IE 11

那是!!navigator.userAgent.match(/Trident\/7\./)

但是我遇到了错误 Object not found and needs to be re-evaluated.

然后我在 IE11 中打开开发者控制台并尝试访问一些预定义的 javascript 对象,我仍然遇到同样的错误。

我试过了

navigator.userAgent

window.navigator

console.log('test');

有人知道吗?

【问题讨论】:

标签: javascript internet-explorer internet-explorer-11


【解决方案1】:

对于一个最小的方法,直到 IE 于 2021 年 8 月 17 日正式死亡 ?✌️? 我正在反向使用 IE 条件语句<!--[if !IE]> --><!-- <![endif]-->。

<style>
:root{display:none!important}
</style>
<!--[if !IE]> -->
<style>
:root{display:initial!important}
</style>
<!-- <![endif]-->

【讨论】:

    【解决方案2】:

    检测IE 11 only的一种非常安全且简洁的方法是

    if(window.msCrypto) {
        // I'm IE11 for sure
    }
    

    或类似的东西

    var IE11= !!window.msCrypto;
    

    msCrypto 是 window.crypto 对象的前缀版本,仅在 IE 11 中实现。
    https://developer.mozilla.org/en-US/docs/Web/API/Window/crypto

    【讨论】:

    • 唯一可行的解​​决方案(这是最短、最干净、最优雅的解决方案)! Royi Namir 的/x64|x32/ig.test(window.navigator.userAgent)也适用于 Firefox!
    • 谢谢,我使用了相反的方法:if(window.crypto),因为在@types 中没有检测到msCrypto
    【解决方案3】:

    好的,试试这个,简单,适用于 IE11 和 IE 11 以下版本

    browserIsIE = navigator.userAgent.toUpperCase().indexOf("TRIDENT/") != -1 || navigator.userAgent.toUpperCase().indexOf("MSIE") != -1;
    

    navigator.userAgent.toUpperCase().indexOf("TRIDENT/") != -1 用于 IE 11 版本 navigator.userAgent.toUpperCase().indexOf("MSIE") != -1 IE 11 以下版本

    browserIsIE = navigator.userAgent.toUpperCase().indexOf("TRIDENT/") != -1 || navigator.userAgent.toUpperCase().indexOf("MSIE") != -1;
    
    console.log('Is IE Browser : '+ browserIsIE)

    【讨论】:

      【解决方案4】:

      我发现 IE11 在不同的环境中提供了多个用户代理字符串。

      与其依赖MSIE等方式,不如依赖Trident版本

      const isIE11 = userAgent => userAgent.match(/Trident\/([\d.]+)/) ? +userAgent.match(/Trident\/([\d.]+)/)[1] >= 7;
      

      希望这会有所帮助:)

      【讨论】:

        【解决方案5】:

        2016 年 11 月 18 日编辑

        此代码也可以工作(对于那些喜欢另一种解决方案,不使用 ActiveX 的人)

        var isIE11 = !!window.MSInputMethodContext && !!document.documentMode;
          // true on IE11
          // false on Edge and other IEs/browsers.
        

        原答案

        为了检查 Ie11 ,你可以使用这个:(经过测试)

        (或运行this)

        !(window.ActiveXObject) &amp;&amp; "ActiveXObject" in window

        我有IE的所有VMS:

        注意:这不适用于 IE11:

        正如您在此处看到的,它返回 true:

        那么我们能做什么:

        显然,他们添加了机器位空间:

        ie11:

        "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; rv:11.0) like Gecko"
        

        ie12:

        "Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; rv:11.0) like Gecko"
        

        所以我们可以这样做:

        /x64|x32/ig.test(window.navigator.userAgent)
        

        这将只为 ie11 返回 true。

        【讨论】:

        • @Jan.是的。对于整个情况,只有 IE11 会返回 true。我刚刚展示了
        • @IanSteffy 这只是为了显示操作的结果(!)。您可以打开 HTML 文件并添加脚本标记并在该脚本中运行命令。 Here run this.
        • x64 同时返回 Chrome 和 Edge
        • 等等,有 IE12 吗?我以为 IE11 是最后一个,我们很快就不必再担心那个愚蠢的浏览器了! ☹
        • 不是否适用于我在 Windows 7 Enterprise 上的 IE 11.0.9600.19431。没有window.MSInputMethodContext。
        【解决方案6】:

        我使用下面的函数来检测 IE 的 9、10 和 11 版本:

        function ieVersion() {
            var ua = window.navigator.userAgent;
            if (ua.indexOf("Trident/7.0") > -1)
                return 11;
            else if (ua.indexOf("Trident/6.0") > -1)
                return 10;
            else if (ua.indexOf("Trident/5.0") > -1)
                return 9;
            else
                return 0;  // not IE9, 10 or 11
        }  
        

        【讨论】:

          【解决方案7】:

          快速检测 MSIE(从版本 6 到 11):

          if(navigator.userAgent.indexOf('MSIE')!==-1
          || navigator.appVersion.indexOf('Trident/') > -1){
             /* Microsoft Internet Explorer detected in. */
          }
          

          【讨论】:

          • 第二个indexOf()不应该是&gt; -1吗?
          • 是的,我不知道为什么它是 >0 而不是 >-1,但是“Trident/”无论如何都会在 appVersion 字符串中显示得更远-
          • 这个答案没有具体检测到 IE 11,这是 OP 要求的
          • 为什么不同时使用 &gt;= 0 或 &gt; -1 ?应该是相同的结果,但更易读/更直接。
          【解决方案8】:

          使用导航器:-

          navigator 是一个对象,其中包含有关客户端计算机浏览器的所有信息。

          navigator.appName 返回客户端机器浏览器的名称。

          navigator.appName === 'Microsoft Internet Explorer' ||  !!(navigator.userAgent.match(/Trident/) || navigator.userAgent.match(/rv:11/)) || (typeof $.browser !== "undefined" &amp;&amp; $.browser.msie === 1) ? alert("Please dont use IE.") : alert("This is not IE")
          &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

          【讨论】:

          • appName 是 IE 11 上的 Netscape。他们尽其所能欺骗开发人员。
          【解决方案9】:

          This link was helpful 。它包含 javascript 代码来检测所有版本的 IE,直到 IE11。我用 IE11 模拟器测试了脚本。要查找 IE11 模拟器,请右键单击 Web 浏览器单击“检查元素”。在页面左下角,向下滚动导航栏并单击桌面图标。 “用户代理字符串”下拉框包含模拟 IE6-11 的选项。

          它有效。我只是在写这个答案前几分钟使用了它。无法发布快照 - 没有足够的声誉。


          这是代码 - 请点击链接再次查看:

          // Get IE or Edge browser version
          var version = detectIE();
          
          if (version === false) {
            document.getElementById('result').innerHTML = '<s>IE/Edge</s>';
          } else if (version >= 12) {
            document.getElementById('result').innerHTML = 'Edge ' + version;
          } else {
            document.getElementById('result').innerHTML = 'IE ' + version;
          }
          
          // 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';
          
            // Edge 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 13
            // 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;
          }
          @import url(https://fonts.googleapis.com/css?family=Fira+Mono|Fira+Sans:300);
          body {
            color: black;
            background-color: white;
            font-family: "Fira Sans", sans-serif;
            font-weight: 300;
            margin: 0;
            padding: 3rem;
          }
          
          h1 {
            color: darkgrey;
            text-align: center;
            font-weight: 300;
            font-size: 1.5rem;
            line-height: 2rem;
          }
          
          h2 {
            text-align: center;
            font-weight: 300;
            font-size: 4rem;
          }
          
          p {
            color: darkgrey;
            text-align: center;
            font-family: "Fira Mono", monospace;
            font-size: 1rem;
            line-height: 1.5rem;
          }
          <h1>Detect IE/Edge version with JavaScript.<br> Updated to recognize Internet Explorer 12+ aka Edge.</h1>
          <h2 id="result">detecting…</h2>
          <p id="details">n/a</p>

          【讨论】:

            【解决方案10】:

            使用这个 RegExp 似乎适用于 IE 10 和 IE 11:

            function isIE(){
                return /Trident\/|MSIE/.test(window.navigator.userAgent);
            }
            

            我没有 IE 10 之前的 IE 来测试这个。

            【讨论】:

              【解决方案11】:

              以上所有答案都忽略了您提到您没有窗口或导航器的事实:-)

              然后我在 IE11 中打开了开发者控制台

              这就是它说的地方

              找不到对象,需要重新评估。

              还有导航器、窗口、控制台,它们都不存在,需要重新评估。我在仿真中遇到过。只需关闭并打开控制台几次。

              【讨论】:

              • 天哪,感谢您实际阅读问题并通过重新评估回答问题。
              • 也为我工作。这就是为什么当 IE 消亡时,世界各地都会举行派对。
              • 关闭和打开控制台对我有用。与 Firefox 或 Chrome 相比的奇怪行为(但它是 IE,所以数字。)
              【解决方案12】:

              以及我是如何实现的

              <script type="text/javascript">
                !(window.ActiveXObject) && "ActiveXObject"
                function isIE11(){
                  return !!navigator.userAgent.match(/Trident.*rv[ :]*11\./);
                }
              </script>
              

              【讨论】:

              • 我认为你的函数中有错字。首先,您进行未使用的条件检查。其次,也许你的意思是&amp;&amp; "ActiveXObject" in window。第三:双重否定!!有什么技巧?
              • !!几乎意味着“强制转换为布尔值”。
              猜你喜欢
              • 1970-01-01
              • 2015-05-29
              • 1970-01-01
              • 2015-06-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多