84

I've looked around a lot, and I understand that there's a lot of ways to detect internet explorer.

My problem is this: I have an area on my HTML document, that when clicked, calls a JavaScript function that is incompatible with internet explorer of any kind. I want to detect if IE is being used, and if so, set the variable to true.

The problem is, I am writing my code out of Notepad++, and when I run the HTML code in browser, none of the methods for detecting IE work. I think the problem is that I am running it out of Notepad++. I need to be able to detect IE, so that based on the variable, I can disable that area of the site. I have tried this:

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';
    }
}

but it doesn't work. How can I detect IE out of Notepad++? That's what I'm testing the HTML out of, but I need a method that'll work with that.

edit

I noticed someone has marked this as a duplicate, and that is understandable. I suppose I was not clear. I cannot use a JQuery answer, so this is not a duplicate as I am asking for a vanilla JS answer.

Edit #2

Is there also a way to detect the Microsoft Edge browser?

Community
  • 1
  • 1
  • 2
    It will be much easier for you to make the code work on IE and other browser instead of writing IE specific code. – Ibu Aug 01 '15 at 03:19
  • 1
    If you can't just fix your function to work in IE, then feature detection is considered by most to be a much, much better way to write code than browser detection. Plus, it is much better at forward compatibility as browsers change. For example, do you already know what you want to do with Edge, Microsoft's newest browser. – jfriend00 Aug 01 '15 at 03:21
  • 1
    possible duplicate of [jQuery: check if user is using IE](http://stackoverflow.com/questions/19999388/jquery-check-if-user-is-using-ie) check the link, there are many solutions – num8er Aug 01 '15 at 03:22
  • If one of the answers below answered your question, the way this site works works, you'd "accept" the answer, more here: [What should I do when someone answers my question](http://stackoverflow.com/help/someone-answers)?. But only if your question really has been answered. If not, consider adding more details to the question. – baao Aug 01 '15 at 14:53
  • Added edge detection to my answer and also a handy link where you can see the latest versions. – Sceptic Aug 05 '15 at 06:10

13 Answers13

94

Here is the latest correct way that I know of how to check for IE and 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');
}

Note that you don't need the extra var isIE10 in your code because it does very specific checks now.

Also check out this page for the latest IE and Edge user agent strings because this answer may become outdated at some point: https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx

Sceptic
  • 1,659
  • 2
  • 15
  • 25
  • 2
    FWIW, when I check `navigator.userAgent` in my Win10/Edge VM I only get the first part of it, which doesn't include the `"Edge"` string. – Dave Newton Aug 24 '15 at 18:07
  • 1
    Wich version of Edge are you using and could you post it here? – Sceptic Aug 25 '15 at 03:16
  • I'm using **VirtualBox 5.0.2 r 102096** and the image is named **Microsoft Edge.Win10.For.Mac.VirtualBox.zip** downloaded from the MS site on Monday 27 Aug 2015. The image desktop background says **Build 10240**, the Edge home page says I'm on the "most recent build of this VM, **20150801**", shown in Settings as **20.10240.16384.0**. – Dave Newton Aug 27 '15 at 18:48
  • Thanks and the navigator.userAgent string? – Sceptic Aug 28 '15 at 04:27
  • 1
    It's being returned as "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" instead of the full string. IIRC I found another SO question regarding the VM/image issue. – Dave Newton Aug 28 '15 at 04:36
  • You could report the bug to Microsoft. The userAgent string should be build according to their own guideline. – Sceptic Aug 28 '15 at 05:36
  • Yes, I understand that; AFAICT they're aware of the problem on this specific VM/Image. – Dave Newton Aug 28 '15 at 06:06
  • @DaveNewton is it confirmed that the user agent string bug you are seeing only happens on the VM/Image? JW. – aug Nov 03 '15 at 17:28
  • @aug Don't know; it was the only place we've seen it here, but this was awhile ago now. – Dave Newton Nov 03 '15 at 18:29
  • if only you could wrap it in a method – mjs Jul 29 '16 at 17:31
38
// detect IE8 and above, and Edge
if (document.documentMode || /Edge/.test(navigator.userAgent)) {
    ... do something
}

Explanation:

document.documentMode

An IE only property, first available in IE8.

/Edge/

A regular expression to search for the string 'Edge' - which we then test against the 'navigator.userAgent' property

Update Mar 2020

@Jam comments that the latest version of Edge now reports Edg as the user agent. So the check would be:

if (document.documentMode || /Edge/.test(navigator.userAgent) || /Edg/.test(navigator.userAgent)) {
    ... do something
}
Chris Halcrow
  • 28,994
  • 18
  • 176
  • 206
  • 2
    This is the only one of this page working for me both on IE and Edge. – Meloman Apr 25 '18 at 14:28
  • 1
    `/Edge\//.test(navigator.userAgent) ` To bre more robust, I prefer to include the backslash. – j.j. Jan 13 '19 at 11:12
  • 1
    In the latest version of Edge, it's just Edg in the user agent. So to test for IE, Edge and Edge chromium, and including the slash: `document.documentMode || /Edge\//.test(navigator.userAgent) || /Edg\//.test(navigator.userAgent)` – Jam Mar 11 '20 at 08:26
  • I suppose you don't need to detect Edge with "Edg" UA string, because it's Chromium-based and probably not wanted to be detected (as opposed to EdgeHTML) – Andrey Jul 24 '20 at 20:59
31

I don't know why, but I'm not seeing "Edge" in the userAgent like everyone else is talking about, so I had to take another route that may help some people.

Instead of looking at the navigator.userAgent, I looked at navigator.appName to distinguish if it was IE<=10 or IE11 and Edge. IE11 and Edge use the appName of "Netscape", while every other iteration uses "Microsoft Internet Explorer".

After we determine that the browser is either IE11 or Edge, I then looked to navigator.appVersion. I noticed that in IE11 the string was rather long with a lot of information inside of it. I arbitrarily picked out the word "Trident", which is definitely not in the navigator.appVersion for Edge. Testing for this word allowed me to distinguish the two.

Below is a function that will return a numerical value of which Internet Explorer the user is on. If on Microsoft Edge it returns the number 12.

Good luck and I hope this helps!

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;          
}
skribbz14
  • 845
  • 7
  • 7
15

I'm using UAParser https://github.com/faisalman/ua-parser-js

var a = new UAParser();
var name = a.getResult().browser.name;
var version = a.getResult().browser.version;
Oren Gal
  • 151
  • 2
  • 2
    In general, feature detection is better than browser detection. That said, if you really need to detect a browser I'd use a library (as suggested here). There are a lot of intricacies to parsing user agent strings, a library will lower the risk of a mistake. – sandstrom Oct 04 '15 at 20:59
  • Very helpful, none of the other solutions worked, this plugin worked perfectly for me. – edencorbin Jan 30 '16 at 03:31
11

Topic is a bit old, but since the scripts here detect Firefox as a False Positive (EDGE v12), here is the version I use:

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

which of course can be written in a more concise way:

function isIEorEDGE(){
  return navigator.appName == 'Microsoft Internet Explorer' || (navigator.appName == "Netscape" && navigator.userAgent.indexOf('.NET') > -1);
}
GavinoGrifoni
  • 743
  • 2
  • 12
  • 33
8

This function worked perfectly for me. It detects Edge as well.

Originally from this 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;
}

Then you can use if (detectIE()) { /* do IE stuff */ } in your code.

phocks
  • 2,933
  • 5
  • 27
  • 28
6

If you just want to give users using a MS browser a warning or something, this code should be good.

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"
}

Thanks to @GavinoGrifoni

patchie
  • 615
  • 1
  • 9
  • 21
3

For me better this:

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;

Go run: http://output.jsbin.com/solicul/1/ o http://jsfiddle.net/Webnewbie/apa1nvu8/

James Peter
  • 151
  • 2
2

Use this snip : var IE = (navigator.userAgent.indexOf("Edge") > -1 || navigator.userAgent.indexOf("Trident/7.0") > -1) ? true : false;

Amin AmiriDarban
  • 2,031
  • 4
  • 24
  • 32
  • 3
    This worked best for me, although the ternary op is redundant. `navigator.userAgent.indexOf("Edge") > -1 || navigator.userAgent.indexOf("Trident/7.0") > -1` evaluates to true or false so you can just return/use that. – Kolby Jun 21 '17 at 17:44
2

One line code to detect the browser.

If the browser is IE or Edge, It will return true;

let isIE = /edge|msie\s|trident\//i.test(window.navigator.userAgent)
shulha yahya
  • 151
  • 1
  • 2
  • 6
0

Here is a javascript class that detects IE10, IE11 and Edge.
Navigator object is injected for testing purposes.

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();
};
Tomás
  • 3,501
  • 3
  • 21
  • 38
0

If we need to check Edge please go head with this

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

//do something

}

prasanth pr
  • 171
  • 1
  • 4
-4

First of all its not the Notepad++ problem for sure. Its your "String Matching problem"

The common string throughout all IE version is MSIE Check out the various userAgent strings at http://www.useragentstring.com/pages/Internet%20Explorer/

if(navigator.userAgent.indexOf("MSIE") != -1){
   alert('I am Internet Explorer!!');
}
  • tried this, it does not work. i ran the code from notepad++ in IE, and there was no alert. I checked the debugger console and there were no errors. I am running windows 7, not sure if that affects version of IE –  Aug 03 '15 at 21:40
  • What is the IE version you are using ? – Amit Prabhu Parrikar Aug 05 '15 at 13:03