views:

1699

answers:

11

In some existing code there is a test to see if the user is running IE, by checking if the object Browser.Engine.trident is defined and returns true.

But how can I determine if the user is running IE6 (or earlier) or IE7 (or later)?

The test is needed inside a JavaScript function so a conditional comment doesn't seem suitable.

Thanks

+2  A: 

I prefer to use jQuery to do this:

if (jQuery.browser.msie == true) { 
if (jQuery.browser.version == 7.0)
  // .. do something for 7.0
else 
  // .. do something for < 7.0
}
Nick Berardi
jQuery is great, but recommending it simply to do a browser check is overkill. On the otherhand, maybe he needs a good reason to get his foot in the door.
TravisO
automatic -1 vote for the SO JavaScript Question Disease, dragging in hundreds of lines of framework to do a trivial one-liner.
bobince
A lot of us are already using jQuery for other reasons, so it's useful to have framework answers to these questions. As you can see, it's much more concise than the pure-javascript solution.
Adam Lassek
+3  A: 

The Navigator object contains all the information about the user's browser:

eg:

var browser=navigator.appName;

var b_version=navigator.appVersion;

var version=parseFloat(b_version);

See:

http://www.w3schools.com/js/js_browser.asp

Winston Smith
That's handy to know but in this case navigator.appVersion returns "4" in both IE6 and IE7 so I can't use that to distinguish between the two. Thanks though.
+2  A: 

If you are checking for a certain functionality, you should check for it directly, e.g. if (window.focus) {window.focus();} Browser detection is never reliable enough.

For more details on object vs browser detection, check out this article at Quirksmode.

On the other hand, if the feature you need IS the browser type and version, e.g. for statistical purposes, go with navigator.appName and navigator.appVersion. (Beware though - many less popular browsers masquerade themselves as MSIE 6 or 7, as certain sites block anything that's not IE on the premise that "all the modern browsers are IE, right?" (hint: not anymore).)

Piskvor
That's a good point. Although in this case the presence of the object doesn't tell me whether this is IE 6 or 7. I need to know to work around a bug in IE6.
+5  A: 

If you really want to be sure you are using IE and a specific version then you could obviously use IE's conditional tags to only run certain code within IE. It's not really that pretty but at least you can be sure that it is really IE and not some spoofed version.

<script>
    var isIE = false;
    var version = -1;
</script>
<!--[if IE 6]>
    <script>
        isIE = true;
        version = 6
    </script>
<![endif]-->
<!--[if IE 7]>
    <script>
        isIE = true;
        version = 7
    </script>
<![endif]-->

It's pretty self explanatory. In IE6 isIE is true and version is 6, In IE7 isIE is true and version is 7 otherwise isIE is false and version is -1

Alternatively you could just roll your own solution using code plagarised from jQuery.

var userAgent = navigator.userAgent.toLowerCase();
var version = (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
var isIE = /msie/.test( userAgent ) && !/opera/.test( userAgent ),
kouPhax
Sorry missed the part of your post where you say conditional comments aren't appropriate
kouPhax
A: 

If they are smart and have any choice whatsoever, they aren't using IE.

T.E.D.
Checking for "smart" in JS is pretty hard to do though. I think I saw a jQuery plugin for that once...
_Lasar
A: 

This is the script I use and it seems to work well enough:

// Returns 0 if the browser is anything but IE
function getIEVersion() {
   var ua = window.navigator.userAgent;
   var ie = ua.indexOf("MSIE ");
   return ((ie > 0) ? parseInt(ua.substring(ie+5, ua.indexOf(".", ie))) : 0);
}

Hope that helps someone...

Jason Bunting
+1  A: 

This is probably going to get voted down, because it's not directly answering the question, but... You should not be writing browser-specific code. There's very little you can't do while coding for most widely-accepted browsers.

EDIT: The only time I found it useful to have conditional comments was when I needed to include ie6.css or ie7.css.

Kon
+4  A: 

From detecting Internet Explorer More Effectively at msdn:

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
  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 checkVersion()
{
  var msg = "You're not using Internet Explorer.";
  var ver = getInternetExplorerVersion();

  if ( ver > -1 )
  {
    if ( ver >= 6.0 ) 
      msg = "You're using a recent copy of Internet Explorer."
    else
      msg = "You should upgrade your copy of Internet Explorer.";
  }
  alert( msg );
}
kmilo
A: 

This should give you more details than you'll want:

var agent = navigator.userAgent;
var msiePattern = /.*MSIE ((\d+).\d+).*/
if( msiePattern.test( agent ) ) {
  var majorVersion = agent.replace(msiePattern,"$2");
  var fullVersion = agent.replace(msiePattern,"$1");
  var majorVersionInt = parseInt( majorVersion );
  var fullVersionFloat = parseFloat( fullVersion );
}
Illandril
A: 

As no-one seems to have said it yet:

The test is needed inside a JavaScript function so a conditional comment doesn't seem suitable.

You can easily put a conditional comment — a JScript conditional comment, not an HTML one — inside a function:

function something() {
    var IE_WIN= false;
    var IE_WIN_7PLUS= false;
    /*@cc_on
    @if (@_win32)
        IE_WIN= true;
        @if (@_jscript_version>=5.7)
            IE_WIN_7PLUS = true;
        @end
    @end @*/
    ...
}

It's more typical to do the test once at global level though, and just check the stored flags thereafter.

CCs are more reliable than sifting through the mess that the User-Agent string has become these days. String matching methods on navigator.userAgent can misidentify spoofing browsers such as Opera.

Of course capability sniffing is much better for cross-browser code where it's possible, but for some cases — usually bug fix workarounds — you do need to identify IE specifically, and CCs are probably the best way to do that today.

bobince
A: 

So IE8 compatibility view mode reports itself as IE7 even though it doesn't always behave the same. And for that, I give you this monster:

    // IE8's "Compatibility mode" is anything but.  Oh well, at least it doesn't take 40 lines of code to detect and work around it.
// Oh wait:
/*
 * Author: Rob Reid
 * CreateDate: 20-Mar-09
 * Description: Little helper function to return details about IE 8 and its various compatibility settings either use as it is
 * or incorporate into a browser object. Remember browser sniffing is not the best way to detect user-settings as spoofing is
 * very common so use with caution.
*/
function IEVersion(){
    var _n=navigator,_w=window,_d=document;
    var version="NA";
    var na=_n.userAgent;
    var ieDocMode="NA";
    var ie8BrowserMode="NA";
    // Look for msie and make sure its not opera in disguise
    if(/msie/i.test(na) && (!_w.opera)){
        // also check for spoofers by checking known IE objects
        if(_w.attachEvent && _w.ActiveXObject){        
            // Get version displayed in UA although if its IE 8 running in 7 or compat mode it will appear as 7
            version = (na.match( /.+ie\s([\d.]+)/i ) || [])[1];
            // Its IE 8 pretending to be IE 7 or in compat mode        
            if(parseInt(version)==7){                
                // documentMode is only supported in IE 8 so we know if its here its really IE 8
                if(_d.documentMode){
                    version = 8; //reset? change if you need to
                    // IE in Compat mode will mention Trident in the useragent
                    if(/trident\/\d/i.test(na)){
                        ie8BrowserMode = "Compat Mode";
                    // if it doesn't then its running in IE 7 mode
                    }else{
                        ie8BrowserMode = "IE 7 Mode";
                    }
                }
            }else if(parseInt(version)==8){
                // IE 8 will always have documentMode available
                if(_d.documentMode){ ie8BrowserMode = "IE 8 Mode";}
            }
            // If we are in IE 8 (any mode) or previous versions of IE we check for the documentMode or compatMode for pre 8 versions            
            ieDocMode = (_d.documentMode) ? _d.documentMode : (_d.compatMode && _d.compatMode=="CSS1Compat") ? 7 : 5;//default to quirks mode IE5                               
        }
    }

    return {
        "UserAgent" : na,
        "Version" : version,
        "BrowserMode" : ie8BrowserMode,
        "DocMode": ieDocMode
    }            
}
var ieVersion = IEVersion();
var IsIE8 = ieVersion.Version != "NA" && ieVersion.Version >= 8;
Mike Ruhlin