Internet Explorer 11 检测

Posted

技术标签:

【中文标题】Internet Explorer 11 检测【英文标题】:Internet Explorer 11 detection 【发布时间】:2014-03-16 12:25:09 【问题描述】:

我知道 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');

有人知道吗?

【问题讨论】:

@Bobkhin 我在上面提到了我的问题。收到错误Object not found and needs to be re-evaluated. How to detect IE 11 with javascript in Asp.net的可能重复 How to detect IE11? 的可能副本 【参考方案1】:

2016 年 11 月 18 日编辑

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

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

原答案

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

(或运行this)

!(window.ActiveXObject) && "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【参考方案2】:

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

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

【讨论】:

第二个indexOf()不应该是> -1吗? 是的,我不知道为什么它是 >0 而不是 >-1,但是“Trident/”无论如何都会在 appVersion 字符串中显示得更远- 这个答案没有检测到 IE 11,这是 OP 所要求的 为什么不同时使用 >= 0> -1 ?应该是相同的结果,但更易读/更直接。 请注意 appVersion 已弃用:developer.mozilla.org/en-US/docs/Web/API/Navigator/appVersion【参考方案3】:

我使用下面的函数来检测 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
  

【讨论】:

【参考方案4】:

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

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

这就是它说的地方

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

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

【讨论】:

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

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

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

或类似的东西

var IE11= !!window.msCrypto;

msCryptowindow.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【参考方案6】:

好的,试试这个,简单,适用于 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)

【讨论】:

【参考方案7】:

以及我是如何实现的

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

【讨论】:

我认为你的函数中有错字。首先,您进行未使用的条件检查。其次,也许你的意思是&amp;&amp; "ActiveXObject" in window。第三:双重否定!!有什么技巧? !!几乎意味着“强制转换为布尔值”。【参考方案8】:

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>

【讨论】:

【参考方案9】:

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

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

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

【讨论】:

【参考方案10】:

使用导航器:-

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。他们尽其所能欺骗开发人员。【参考方案11】:

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

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

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

希望这会有所帮助:)

【讨论】:

【参考方案12】:

为了最简单的方法,直到 IE 于 2021 年 8 月 17 日正式死亡 ?✌️? 我正在反向使用 IE 条件语句&lt;!--[if !IE]&gt; --&gt;&lt;!-- &lt;![endif]--&gt;

<style>
:rootdisplay:none!important
</style>
<!--[if !IE]> -->
<style>
:rootdisplay:initial!important
</style>
<!-- <![endif]-->

【讨论】:

以上是关于Internet Explorer 11 检测的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Internet Explorer 或 Microsoft Edge 中检测到触摸

检测旧的 Internet Explorer Javascript 函数(< ES6)

如何仅使用 JavaScript 定位 Internet Explorer 11?

html 使用HTML检测Internet Explorer

html 使用HTML检测Internet Explorer

网站的基本 Google 登录代码在 Internet Explorer 11 中不起作用