Skip to content

Instantly share code, notes, and snippets.

@padolsey
Created August 16, 2010 20:30
Show Gist options
  • Save padolsey/527683 to your computer and use it in GitHub Desktop.
Save padolsey/527683 to your computer and use it in GitHub Desktop.
// ----------------------------------------------------------
// A short snippet for detecting versions of IE in JavaScript
// without resorting to user-agent sniffing
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
// ie === undefined
// If you're in IE (>=5) then you can determine which version:
// ie === 7; // IE7
// Thus, to detect IE:
// if (ie) {}
// And to detect the version:
// ie === 6 // IE6
// ie > 7 // IE8, IE9 ...
// ie < 9 // Anything less than IE9
// ----------------------------------------------------------
// UPDATE: Now using Live NodeList idea from @jdalton
var ie = (function(){
var undef,
v = 3,
div = document.createElement('div'),
all = div.getElementsByTagName('i');
while (
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]
);
return v > 4 ? v : undef;
}());
@moussahoumani
Copy link

The expression in the while statement was done proper though for clarity I'd use a do-while.
Interesting :{D, fail on IE10, the last code you sent looks odd to me mainly because agent sniffing, I find the conditional comment interesting, I and requires just don't like the condition compilation stuff for IE10 detection. Because James uses a pre-increment to increment v:

Copy link

ghost commented Nov 7, 2013

(+/-) from the grade listed.

Copy link

ghost commented Nov 7, 2013

(+/-) from the grade listed.

Copy link

ghost commented Nov 7, 2013

(+/-) from the grade listed.

Copy link

ghost commented Nov 7, 2013

(+/-) from the grade listed.

@davidhellsing
Copy link

I wanted this script to include IE10+11 as well, and my tests works fine by just returning document.documentMode instead of undefined, since it will be undefined for non-IE browsers anyway (I also prefer do...while...):

var ie = (function() {
  var v = 3
    , div = document.createElement( 'div' )
    , all = div.getElementsByTagName( 'i' )
  do
    div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->'
  while 
    (all[0])
  return v > 4 ? v : document.documentMode
}())

Copy link

ghost commented Jan 23, 2014

So I tried the code above, also davidhellsing's version, and I tested this on ie8, and it always says it's version 7, when it's 8. So I don't think this works on ie8.

Copy link

ghost commented Jan 23, 2014

Also, just tried it in ie10 and ie gets declared as undefined.

@artboard-studio
Copy link

@ttfkam Best Solution for IE10+

@alextreppass
Copy link

For any future spelunkers, the @davidhellsing version just above works fine on IE8 through IE11

@tadudek
Copy link

tadudek commented Aug 8, 2014

If I'm testing IE11, but it's forced into ie8 via 'IE=EmulateIE8', this solution from @davidhellsing still show the IE version as 8, not as 11. Any thoughts? I want to determine if it's really IE10/11.

@hayatbiralem
Copy link

You can use bowser.

@taveras
Copy link

taveras commented Jun 18, 2015

This is slick!

@tamer1an
Copy link

tamer1an commented Jul 2, 2015

Unfortunately IE>=10 don't have conditional comments

@jeremykohn
Copy link

The best option for IE / Edge these days is probably Layout Engine or something similar that uses JavaScript to detect browser features.

User agents can be forged or altered so I wouldn't rely on UA sniffing.

@Webnewbies
Copy link

Maybe help:

var ie = 'NotIE'; //IE5-11
if( !!document.compatMode ) {
if( !!(Math && Math.acosh) ) ie = 'EDGE 12';
if( !!document.uniqueID){
if(!!window.ActiveXObject){ ie = 11; }
else if(!!document.all){
if(!!window.atob){ie = 10;}
else if(!!document.addEventListener) {ie = 9;}
else if(!!document.querySelector){ie = 8;}
else if(!!window.XMLHttpRequest){ie = 7;}
else if(!!document.compatMode){ie = 6;}
else ie = 5;
}
}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment