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

IT技术 javascript html internet-explorer media-queries microsoft-edge
2021-03-02 23:51:37

我环顾四周,我知道有很多方法可以检测 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 浏览器的方法?

6个回答

这是我所知道的关于如何检查 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,当我签navigator.userAgent入我的 Win10/Edge VM 时,我只得到它的第一部分,其中不包括"Edge"字符串。
2021-04-25 23:51:37
它作为“Mozilla/5.0 (Windows NT 10.0; Win64; x64)”而不是完整字符串返回。IIRC 我发现了另一个关于 VM/映像问题的 SO 问题。
2021-04-27 23:51:37
谢谢和 navigator.userAgent 字符串?
2021-04-28 23:51:37
我正在使用VirtualBox 5.0.2 r 102096,图像名为Microsoft Edge.Win10.For.Mac.VirtualBox.zip,于 2015 年 8 月 27 日星期一从 MS 站点下载。图像桌面背景显示Build 10240,Edge 主页说我在“这个虚拟机的最新版本,20150801 ”,在设置中显示为20.10240.16384.0
2021-05-02 23:51:37
你使用的是哪个版本的 Edge,你能把它贴在这里吗?
2021-05-13 23:51:37
// 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 上都对我有用的页面。
2021-04-26 23:51:37
/Edge\//.test(navigator.userAgent) 为了更强大,我更喜欢包含反斜杠。
2021-04-30 23:51:37
在最新版本的 Edge 中,它只是用户代理中的 Edg。所以要测试 IE、Edge 和 Edge 铬,包括斜线:document.documentMode || /Edge\//.test(navigator.userAgent) || /Edg\//.test(navigator.userAgent)
2021-05-13 23:51:37
我想你不需要用“Edg”UA 字符串检测 Edge,因为它是基于 Chromium 的,可能不希望被检测到(而不是 EdgeHTML)
2021-05-14 23:51:37

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

我没有查看 navigator.userAgent,而是查看 navigator.appName 来区分它是 IE<=10 还是 IE11 和 Edge。IE11 和 Edge 使用“Netscape”的 appName,而其他所有迭代都使用“Microsoft Internet Explorer”。

在我们确定浏览器是 IE11 或 Edge 之后,我查看了 navigator.appVersion。我注意到在 IE11 中,字符串很长,里面有很多信息。我随意挑出了“三叉戟”这个词,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;          
}
同上。在 Chrome、Opera、Firefox、Safari 上失败
2021-04-25 23:51:37
这不起作用。在 Chrome、Opera、Firefox 和(可能)Safari 中navigator.appName == "Netscape"评估为 true。
2021-04-29 23:51:37
@edencorbin 我在下面发布了一个解决这个问题的答案。stackoverflow.com/a/36688806/2304450
2021-05-03 23:51:37
这在 edge 和 firefox 中都返回 12。
2021-05-20 23:51:37

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

var a = new UAParser();
var name = a.getResult().browser.name;
var version = a.getResult().browser.version;
非常有帮助,其他解决方案都不起作用,这个插件非常适合我。
2021-04-22 23:51:37
一般来说,特征检测优于浏览器检测。也就是说,如果你真的需要检测浏览器,我会使用一个库(如这里所建议的)。解析用户代理字符串有很多复杂性,库会降低出错的风险。
2021-05-04 23:51:37

话题有点旧,但由于这里的脚本将 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);
}
IE 11 失败。IE 11 仅提供“Netscape”作为应用程序名称,因此无法满足条件
2021-04-23 23:51:37
为边缘返回 false
2021-04-26 23:51:37
@CreamWhippedAirplane 似乎他们改变了navigator.appVersion:现在它不再包含“Trident”,而是正确地将“Edge”添加到名称中。立即更新我的答案!
2021-05-02 23:51:37
在browserstack.com上测试时这对我不起作用,我不知道它是否在真机上有效!但是在浏览器Netscape堆栈上我得到了appName ...
2021-05-09 23:51:37
@CreamWhippedAirplane 你能在这里发布你的 Edge 版本给出的 navigator.appName 的结果吗?也许他们最近改变了它
2021-05-13 23:51:37