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


81

我到处走走了很多,我知道有很多方法可以检测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浏览器的方法吗?


2
使您的代码在IE和其他浏览器上工作变得容易得多,而不是编写IE特定代码。
伊布

1
如果您不能仅仅修复您的功能以在IE中工作,那么功能检测通常被认为是比浏览器检测更好得多的编写代码的方法。另外,随着浏览器的变化,它在向前兼容性方面要好得多。例如,您是否已经知道要使用Microsoft最新的浏览器Edge做些什么。
jfriend00

1
jQuery的可能重复项:检查用户是否使用IE 检查链接,有很多解决方案
num8er

如果下面的答案之一回答了您的问题,则此站点的工作方式正常运行,您将“接受”答案,更多信息请参见:当有人回答我的问题时我该怎么办?但前提是您的问题确实得到了回答。如果不是,请考虑为问题添加更多详细信息。
baao 2015年

在我的答案中添加了边缘检测功能,并且还提供了一个方便的链接,您可以在其中查看最新版本。
怀疑论者

Answers:


31

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

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

确定浏览器是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;          
}

7
这在Edge和Firefox中都返回12。
edencorbin '16

@edencorbin我在下面发布了一个答案来解决这个问题。stackoverflow.com/a/36688806/2304450
GavinoGrifoni,2016年

4
这是行不通的。在Chrome,Opera,Firefox和(可能)Safari中,navigator.appName == "Netscape"评估结果为true。
杰克·吉芬

2
同上。无法在Chrome,Opera,Firefox,Safari上运行
BBaysinger

91

这是我知道如何检查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/zh-cn/library/hh869301%28v=vs.85%29。 aspx


2
FWIW,当我检navigator.userAgent入Win10 / Edge VM时,我只得到它的第一部分,其中不包含"Edge"字符串。
戴夫牛顿

1
您使用的是Edge版本,可以在此处发布吗?
怀疑论者2015年

我正在使用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
戴夫牛顿

谢谢和navigator.userAgent字符串吗?
怀疑论者2015年

1
它以“ Mozilla / 5.0(Windows NT 10.0; Win64; x64)”而不是完整字符串的形式返回。IIRC我发现了另一个有关VM /映像问题的问题。
戴夫牛顿

36
// 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
}

2
这是该页面在IE和Edge上为我工作的唯一页面。
Meloman '18

1
/Edge\//.test(navigator.userAgent) 为了使功能更强大,我更喜欢包含反斜杠。
jj

1
在最新版本的Edge中,它只是用户代理中的Edg。因此,要测试IE,Edge和Edge铬,并包括斜线:document.documentMode || /Edge\//.test(navigator.userAgent) || /Edg\//.test(navigator.userAgent)
果酱

我想您不需要用“ Edg” UA字符串检测Edge,因为它是基于Chromium的并且很可能不想被检测到(与EdgeHTML相对)
Andrey

15

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

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

2
通常,功能检测优于浏览器检测。就是说,如果您确实需要检测浏览器,则可以使用一个库(如此处建议)。解析用户代理字符串有很多复杂性,库会降低出错的风险。
sandstrom 2015年

非常有帮助,其他解决方案均无效,此插件对我而言效果理想。
edencorbin '16

11

主题有点老,但是由于此处的脚本将Firefox检测为False Positive(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);
}

为边缘返回假
奶油鲜奶飞机

@CreamWhippedAirplane您可以在此处发布您的Edge版本给出的navigator.appName结果吗?也许他们最近更改过
GavinoGrifoni,2016年

@CreamWhippedAirplane似乎已更改navigator.appVersion:现在,它不再包含“ Trident”,而是在名称中正确添加了“ Edge”。立即更新我的答案!
GavinoGrifoni'7

当在browserstack.com上测试时,这对我不起作用,我不知道它是否可以在真实计算机上工作!但是在浏览器Netscape堆栈上,我的名字是appName ...
Betty St

4
IE 11失败。IE 11仅将“ Netscape”作为应用程序名称,从而使条件失败
Ankur Aggarwal

8

此功能对我来说非常理想。它也检测Edge。

最初来自此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
梅丽莎·弗里曼

6

如果您只是想给使用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



2

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


3
尽管三元运算是多余的,但这对我来说效果最好。navigator.userAgent.indexOf("Edge") > -1 || navigator.userAgent.indexOf("Trident/7.0") > -1计算结果为true或false,因此您可以返回/使用它。
Kolby

2

一行代码来检测浏览器。

如果浏览器是IE或Edge,它将返回true;否则,将返回true。

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

0

这是一个检测IE10,IE11和Edge的JavaScript类。
导航器对象是出于测试目的而注入的。

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();
};

0

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

if(navigator.userAgent.indexOf(“ Edge”)> 1){

//do something

}


-4

首先,它肯定不是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版本?
阿米特·帕布·帕里卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.