Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
//detect Internet Explorer and version number through injected conditional comments (no UA detect, no need for cond. compilation / jscript check)
//version arg is for IE version (optional)
//comparison arg supports 'lte', 'gte', etc (optional)
var isIE = (function(undefined){
var doc = document,
doc_elem = doc.documentElement,
cache = {},
elem;
return function( version, comparison ) {
if(/*@cc_on!@*/true){return false;}
var key = [ comparison || '', 'IE', version || '' ].join(' ');
if ( cache[ key ] === undefined ) {
elem = elem || doc.createElement( 'B' );
elem.innerHTML = '<!--[if '+ key +']><b></b><![endif]-->';
cache[ key ] = !!elem.getElementsByTagName( 'b' ).length;
}
return cache[ key ];
};
})();
//minified:
var isIE=(function(){var doc=document,doc_elem=doc.documentElement,cache={},elem;return function(version,comparison){if(/*@cc_on!@*/true){return false;}var key=[comparison||"","IE",version||""].join(" ");if(cache[key]===undefined){elem=elem||doc.createElement("B");elem.innerHTML="<!--[if "+key+"]><b></b><![endif]-->";cache[key]=!!elem.getElementsByTagName("b").length;}return cache[key];};})();
//is it IE?
isIE();
//is it IE6?
isIE(6);
//is it less than or equal to IE 7?
isIE(7,'lte');

Note that cache[ key ] === undefined could blow up since it is currently legal to do undefined = true; therefore, modifying the anonymous function declaration to accept a single argument called undefined and then not passing it in will ensure that it is actually undefined. I believe this was first popularized by jQuery 1.4.

-- var isIE = (function(){
++ var isIE = (function(undefined){
Owner

great point and nice catch :)
added.
thanks!

cowboy commented Apr 8, 2010

Yeah, my bad. I do this in all my plugins, but forgot to do it here!

You are missing the 'undefined' argument in the minified version. -- just say'n.

A similar trick over here: http://gist.github.com/527683

A cleaner way than that unused function argument, IMHO:

-- var isIE = (function(){
++ var isIE = (function(){var undefined;

Declaring a new variable named undefined overrides whatever it might be defined in the enclosing scope; and obviously, leaving it undefined makes it, well, function as undefined is intended to. (Personally, because I like allowing people to do evil hacks with undefined if they want, I use var u; in a new scope, instead, in most of my code.)

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