-
-
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; | |
}()); |
@nrako: thanks for the heads up. But adding a space like you did does break the code. Try it on http://jsfiddle.net/P5z4N/4/
@nrako: here is a different version that might work for you :)
Try it on http://jsfiddle.net/e8G3S/1/
// Returns the version of Internet Explorer or a -1 (indicating the use of another browser)
function getInternetExplorerVersion(){
var rv = -1; // Return value assumes failure.
if (navigator.appName == 'Microsoft Internet Explorer'){
var ua = navigator.userAgent;
var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
if (re.exec(ua) != null)
rv = parseFloat( RegExp.$1 );
}
return rv;
}
function displayAlert(){
var msg = "You're not using Internet Explorer.";
var ver = getInternetExplorerVersion();
if ( ver > -1 ){
if ( ver <= 8.0 ){
msg = "You're using Internet Explorer 8 or below" ;
}
else if ( ver >= 9.0 && ver < 10.0 ){
msg = "You're using IE 9 or above";
}
else{
msg = "You're using IE 10";
}
}
alert( msg );
}
@adrien-be indeed it fail on IE10, the last code you sent is quite different it's solely useragent sniffing, and I still love the conditional comment better, I (and requirejs) just don't like the condition compilation stuff for IE10 detection.
Smaller yet? https://gist.github.com/devxdev/6506658
I Can't test I'm on Ubuntu. maybe smaller if undefined
isn't required in the last ()
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:
(+/-) from the grade listed.
(+/-) from the grade listed.
(+/-) from the grade listed.
(+/-) from the grade listed.
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
}())
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.
Also, just tried it in ie10 and ie gets declared as undefined.
@ttfkam Best Solution for IE10+
For any future spelunkers, the @davidhellsing version just above works fine on IE8 through IE11
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.
You can use bowser.
This is slick!
Unfortunately IE>=10 don't have conditional comments
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.
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;
}
}
}
Beware I wasted an awful of time on a IE issue related to requirejs trying to eval the last version of this gist submitted by @ecstaticpeon. So if you use this through requirejs and have a http://requirejs.org/docs/errors.html#fromtexteval error msg, it's definitely because of
/*@cc_on
I just added a space like this/* @cc_on
and now the eval() pass. But I didn't tested on IE10 yet... anyway I don't like this conditional compilation stuff, I'll try to find something else.