如何使用 JavaScript 检测 Internet Explorer (IE) 和 Microsoft Edge?

Posted

技术标签:

【中文标题】如何使用 JavaScript 检测 Internet Explorer (IE) 和 Microsoft Edge?【英文标题】:How can I detect Internet Explorer (IE) and Microsoft Edge using JavaScript? 【发布时间】:2015-10-23 19:44:13 【问题描述】:

我环顾四周,知道有很多方法可以检测 Internet Explorer。

我的问题是:我的 html 文档中有一个区域,单击该区域时会调用与任何类型的 Internet Explorer 都不兼容的 javascript 函数。 我想检测是否正在使用 IE,如果是,请将变量设置为 true。

问题是,我正在用 Notepad++ 编写代码,当我在浏览器中运行 HTML 代码时,检测 IE 的方法都不起作用。我认为问题在于我用 Notepad++ 运行它。我需要能够检测 IE,以便基于变量,我可以禁用站点的该区域。我试过这个:

var isIE10 = false;

if (navigator.userAgent.indexOf("MSIE 10") > -1) 
    // this is internet explorer 10
    isIE10 = true;
   window.alert(isIE10);


var isIE = (navigator.userAgent.indexOf("MSIE") != -1);

if(isIE)
    if(!isIE10)
    window.location = 'pages/core/ie.htm';
    

但它不起作用。如何从 Notepad++ 中检测 IE?这就是我要测试 HTML 的内容,但我需要一个可以处理它的方法。

编辑

我注意到有人将此标记为重复,这是可以理解的。我想我不清楚。我不能使用 JQuery 答案,所以这不是重复的,因为我要求的是香草 JS 答案。

编辑#2

还有检测 Microsoft Edge 浏览器的方法吗?

【问题讨论】:

让代码在 IE 和其他浏览器上运行会更容易,而不是编写 IE 特定的代码。 如果你不能仅仅修复你的函数以在 IE 中工作,那么大多数人认为特征检测是一种比浏览器检测更好的代码编写方法。另外,随着浏览器的变化,它的前向兼容性要好得多。例如,您是否已经知道要使用 Microsoft 最新的浏览器 Edge 做什么。 jQuery: check if user is using IE的可能重复检查链接,有很多解决方案 如果以下答案之一回答了您的问题,本网站的工作方式,您将“接受”答案,更多信息请点击此处:What should I do when someone answers my question?。但前提是你的问题真的得到了回答。如果没有,请考虑在问题中添加更多详细信息。 在我的答案中添加了边缘检测,还有一个方便的链接,您可以在其中查看最新版本。 【参考方案1】:

这是我知道的关于如何检查 IE 和 Edge 的最新正确方法:

if (/MSIE 10/i.test(navigator.userAgent)) 
   // This is internet explorer 10
   window.alert('isIE10');


if (/MSIE 9/i.test(navigator.userAgent) || /rv:11.0/i.test(navigator.userAgent)) 
    // This is internet explorer 9 or 11
    window.location = 'pages/core/ie.htm';


if (/Edge\/\d./i.test(navigator.userAgent))
   // This is Microsoft Edge
   window.alert('Microsoft Edge');

请注意,您的代码中不需要额外的 var isIE10,因为它现在进行非常具体的检查。

还请查看此页面以获取最新的 IE 和 Edge 用户代理字符串,因为此答案可能会在某些时候过时:https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx

【讨论】:

FWIW,当我在我的 Win10/Edge VM 中检查 navigator.userAgent 时,我只得到它的第一部分,其中不包括 "Edge" 字符串。 您使用的是哪个版本的 Edge,可以在这里发布吗? 我正在使用 VirtualBox 5.0.2 r 102096 并且图像名为 Microsoft Edge.Win10.For.Mac.VirtualBox.zip 已下载2015 年 8 月 27 日星期一来自 MS 网站。图像桌面背景显示 Build 10240,Edge 主页显示我在“此 VM 的最新版本,20150801",在设置中显示为 20.10240.16384.0 谢谢 navigator.userAgent 字符串? 它被返回为“Mozilla/5.0 (Windows NT 10.0; Win64; x64)”而不是完整的字符串。 IIRC 我发现了另一个关于 VM/图像问题的 SO 问题。【参考方案2】:
// detect IE8 and above, and Edge
if (document.documentMode || /Edge/.test(navigator.userAgent)) 
    ... do something

解释:

document.documentMode

一个仅限 IE 的属性,首先在 IE8 中可用。

/Edge/

用于搜索字符串“Edge”的正则表达式 - 然后我们针对“navigator.userAgent”属性进行测试

2020 年 3 月更新

@Jam 发现最新版本的 Edge 现在将 Edg 报告为用户代理。所以检查将是:

if (document.documentMode || /Edge/.test(navigator.userAgent) || /Edg/.test(navigator.userAgent)) 
    ... do something

【讨论】:

这是此页面中唯一一个在 IE 和 Edge 上都适用于我的页面。 /Edge\//.test(navigator.userAgent) 为了更健壮,我更喜欢包含反斜杠。 在最新版本的 Edge 中,它只是用户代理中的 Edg。所以要测试 IE、Edge 和 Edge chromium,包括斜线:document.documentMode || /Edge\//.test(navigator.userAgent) || /Edg\//.test(navigator.userAgent) 我想你不需要用 "Edg" UA 字符串检测 Edge,因为它是基于 Chromium 的,可能不希望被检测到(与 EdgeHTML 相反)【参考方案3】:

我不知道为什么,但我没有像其他人所说的那样在 userAgent 中看到“Edge”,所以我不得不采取另一条可能对某些人有所帮助的路线。

我没有查看 navigator.userAgent,而是查看了 navigator.appName 以区分它是 IE

在我们确定浏览器是 IE11 或 Edge 之后,我查看了 navigator.appVersion。我注意到在 IE11 中,字符串相当长,里面有很多信息。我随意挑出了“Trident”这个词,Edge 的 navigator.appVersion 中绝对没有这个词。测试这个词让我能够区分这两者。

下面是一个函数,它将返回用户所使用的 Internet Explorer 的数值。如果在 Microsoft Edge 上返回数字 12。

祝你好运,我希望这会有所帮助!

function Check_Version()
    var rv = -1; // Return value assumes failure.

    if (navigator.appName == 'Microsoft Internet Explorer')

       var ua = navigator.userAgent,
           re  = new RegExp("MSIE ([0-9]1,[\\.0-9]0,)");

       if (re.exec(ua) !== null)
         rv = parseFloat( RegExp.$1 );
       
    
    else if(navigator.appName == "Netscape")                       
       /// in IE 11 the navigator.appVersion says 'trident'
       /// in Edge the navigator.appVersion does not say trident
       if(navigator.appVersion.indexOf('Trident') === -1) rv = 12;
       else rv = 11;
           

    return rv;          

【讨论】:

这在 edge 和 firefox 中都返回 12。 @edencorbin 我在下面发布了一个解决此问题的答案。 ***.com/a/36688806/2304450 这不起作用。在 Chrome、Opera、Firefox 和(可能)Safari 中,navigator.appName == "Netscape" 的计算结果为 true。 同上。在 Chrome、Opera、Firefox、Safari 上失败【参考方案4】:

我正在使用 UAParser https://github.com/faisalman/ua-parser-js

var a = new UAParser();
var name = a.getResult().browser.name;
var version = a.getResult().browser.version;

【讨论】:

一般来说,特征检测优于浏览器检测。也就是说,如果你真的需要检测浏览器,我会使用一个库(如这里所建议的那样)。解析用户代理字符串有很多复杂性,库会降低出错的风险。 非常有帮助,其他解决方案都不起作用,这个插件非常适合我。【参考方案5】:

话题有点老了,但是由于这里的脚本将 Firefox 检测为误报(EDGE v12),所以这是我使用的版本:

function isIEorEDGE()
  if (navigator.appName == 'Microsoft Internet Explorer')
    return true; // IE
  
  else if(navigator.appName == "Netscape")                       
     return navigator.userAgent.indexOf('.NET') > -1; // Only Edge uses .NET libraries
         

  return false;

当然可以写得更简洁:

function isIEorEDGE()
  return navigator.appName == 'Microsoft Internet Explorer' || (navigator.appName == "Netscape" && navigator.userAgent.indexOf('.NET') > -1);

【讨论】:

边缘返回 false @CreamWhippedAirplane 你能在这里发布你的 Edge 版本给出的 navigator.appName 的结果吗?也许他们最近改变了它 @CreamWhippedAirplane 似乎他们改变了navigator.appVersion:现在它不再包含“Trident”,而是他们正确地在名称中添加了“Edge”。现在更新我的答案! 这在browserstack.com上测试时对我不起作用,我不知道它是否适用于真机!但是在浏览器堆栈上我得到了Netscape 作为appName ... IE 11 失败。IE 11 仅提供“Netscape”作为应用程序名,因此不符合条件【参考方案6】:

这个功能非常适合我。它也检测边缘。

最初来自这个 Codepen:

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

/**
 * 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;

然后你可以在你的代码中使用if (detectIE()) /* do IE stuff */

【讨论】:

这在 2019 年对我有用。此页面上的其他解决方案对 Firefox 给出了误报,甚至对 IE 11 给出了误报。【参考方案7】:

如果你只是想给使用 MS 浏览器的用户一个警告什么的,这段代码应该不错。

HTML:

<p id="IE">You are not using a microsoft browser</p>

Javascript:

using_ms_browser = navigator.appName == 'Microsoft Internet Explorer' || (navigator.appName == "Netscape" && navigator.appVersion.indexOf('Edge') > -1) || (navigator.appName == "Netscape" && navigator.appVersion.indexOf('Trident') > -1);

if (using_ms_browser == true)
    document.getElementById('IE').innerHTML = "You are using a MS browser"

感谢@GavinoGrifoni

【讨论】:

【参考方案8】:

对我来说更好:

var uA = window.navigator.userAgent,
    onlyIEorEdge = /msie\s|trident\/|edge\//i.test(uA) && !!( document.uniqueID || window.MSInputMethodContext),
    checkVersion = (onlyIEorEdge && +(/(edge\/|rv:|msie\s)([\d.]+)/i.exec(uA)[2])) || NaN;

快跑:http://output.jsbin.com/solicul/1/ o http://jsfiddle.net/Webnewbie/apa1nvu8/

【讨论】:

【参考方案9】:

使用此片段:var IE = (navigator.userAgent.indexOf("Edge") &gt; -1 || navigator.userAgent.indexOf("Trident/7.0") &gt; -1) ? true : false;

【讨论】:

这对我来说效果最好,尽管三元运算是多余的。 navigator.userAgent.indexOf("Edge") &gt; -1 || navigator.userAgent.indexOf("Trident/7.0") &gt; -1 计算结果为真或假,因此您可以返回/使用它。【参考方案10】:

检测浏览器的一行代码。

如果浏览器是IE或Edge,则返回true;

let isIE = /edge|msie\s|trident\//i.test(window.navigator.userAgent)

【讨论】:

【参考方案11】:

这是一个检测 IE10、IE11 和 Edge 的 javascript 类。 Navigator 对象被注入用于测试目的。

var DeviceHelper = function (_navigator) 
    this.navigator = _navigator || navigator;
;
DeviceHelper.prototype.isIE = function() 
    if(!this.navigator.userAgent) 
        return false;
    

    var IE10 = Boolean(this.navigator.userAgent.match(/(MSIE)/i)),
        IE11 = Boolean(this.navigator.userAgent.match(/(Trident)/i));
    return IE10 || IE11;
;

DeviceHelper.prototype.isEdge = function() 
    return !!this.navigator.userAgent && this.navigator.userAgent.indexOf("Edge") > -1;
;

DeviceHelper.prototype.isMicrosoftBrowser = function() 
    return this.isEdge() || this.isIE();
;

【讨论】:

【参考方案12】:

如果我们需要检查 Edge,请继续

if(navigator.userAgent.indexOf("Edge") > 1 )

//do something

【讨论】:

【参考方案13】:

首先肯定不是 Notepad++ 的问题。 这是您的“字符串匹配问题

所有 IE 版本的通用字符串是 MSIE 在http://www.useragentstring.com/pages/Internet%20Explorer/查看各种 userAgent 字符串

if(navigator.userAgent.indexOf("MSIE") != -1)
   alert('I am Internet Explorer!!');

【讨论】:

试过了,还是不行。我在 IE 中从 notepad++ 运行代码,但没有任何警报。我检查了调试器控制台,没有错误。我正在运行 Windows 7,不确定这是否会影响 IE 的版本 你用的是什么IE版本?

以上是关于如何使用 JavaScript 检测 Internet Explorer (IE) 和 Microsoft Edge?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置Intern 4以使用RequireJS?

如何将 Intern 添加到 Dojo 项目中?

如何使用 JavaScript 检测移动设备?

如何使用 Javascript 检测触摸悬停?

如何使用 javascript 检测表情符号

如何使用 javascript 检测表情符号