-
-
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; | |
}()); |
Regarding IE 10 detection and following @Daniel15's idea, we can use @_jscript_version instead of the UA (see http://msdn.microsoft.com/en-us/library/ie/s59bkzce%28v=vs.94%29.aspx):
var ie_version = (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;
}());
/*@cc_on
if (typeof(ie_version) == 'undefined') {
ie_version = parseInt(@_jscript_version);
}
@*/
Note that we could only use that last if statement, but then that would return incorrect version numbers when changing the browser mode.
As mentioned before, this may break in IE 11.
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.
@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;
}
}
}
I needed IE10 support, as I was using the imagesloaded plugin in combination with imgrefresh (https://code.google.com/p/image-refresh/) (so to refresh unloaded images in ie), as IE still has issues with cached images! So the check had to be extended to IE10. Here's the code. I'm not a JS guru, so I've probably brutalized it, but it does work now for IE10 -- based on Daniel15's Idea.
If someone wants to make it all sparkly again, by all means.