A DOM-Based Snakes Game, Part I: The Sniffer | WebReference

A DOM-Based Snakes Game, Part I: The Sniffer


A DOM-Based Snakes Game, Part I (6)

The Sniffer

With the introduction of Internet Explorer 5.0 it's getting more difficult to keep track of the browser type and version. The number of platforms is also getting larger. Netscape's introduction of the Gecko browsing engine and AOL's Opera release are just two examples. Netscape has released what they call "The Sniffer". The Sniffer is a JavaScript function, Is(). You use this function to create a new object. The properties of this object indicate the browser and platform versions of a user's client machine. Here is the Is() function:

function Is ()
{   // convert all characters to lowercase to simplify testing
  var agt=navigator.userAgent.toLowerCase();
  // *** BROWSER VERSION ***
  // Note: On IE5, these return 4, so use is.ie5up to detect IE5.
  this.major = parseInt(navigator.appVersion);
  this.minor = parseFloat(navigator.appVersion);
  this.nav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
              && (agt.indexOf('compatible') == -1) &&
                (agt.indexOf('opera')==-1)
  // (The above two lines should be joined as one line.
  // They have been split for formatting purposes.)
              && (agt.indexOf('webtv')==-1));
  this.nav2 = (this.nav && (this.major == 2));
  this.nav3 = (this.nav && (this.major == 3));
  this.nav4 = (this.nav && (this.major == 4));
  this.nav4up = (this.nav && (this.major >= 4));
  this.navonly      = (this.nav && ((agt.indexOf(";nav") != -1) ||
                        (agt.indexOf("; nav") != -1)) );
  this.nav5 = (this.nav && (this.major == 5));
  this.nav5up = (this.nav && (this.major >= 5));
  this.ie   = (agt.indexOf("msie") != -1);
  this.ie3  = (this.ie && (this.major < 4));
  this.ie4  = (this.ie && (this.major == 4) &&
    (agt.indexOf("msie 5.0")==-1) );
  // (The above two lines should be joined as one line.
  // They have been split for formatting purposes.)
  this.ie4up  = (this.ie  && (this.major >= 4));
  this.ie5  = (this.ie && (this.major == 4) &&
    (agt.indexOf("msie 5.0")!=-1) );
  // (The above two lines should be joined as one line.
  // They have been split for formatting purposes.)
  this.ie5up  = (this.ie  && !this.ie3 && !this.ie4);
  // KNOWN BUG: On AOL4, returns false if IE3 is embedded browser
  // or if this is the first browser window opened.  Thus the
  // properties is.aol, is.aol3, and is.aol4 aren't 100% reliable.
  this.aol   = (agt.indexOf("aol") != -1);
  this.aol3  = (this.aol && this.ie3);
  this.aol4  = (this.aol && this.ie4);
  this.opera = (agt.indexOf("opera") != -1);
  this.webtv = (agt.indexOf("webtv") != -1);
  // *** JAVASCRIPT VERSION CHECK ***
  if (this.nav2 || this.ie3) this.js = 1.0
  else if (this.nav3 || this.opera) this.js = 1.1
  else if ((this.nav4 && (this.minor <= 4.05)) || this.ie4) this.js = 1.2
  else if ((this.nav4 && (this.minor > 4.05)) || this.ie5) this.js = 1.3
  else if (this.nav5) this.js = 1.4
  // NOTE: In the future, update this code when newer versions of JS
  // are released. For now, we try to provide some upward compatibility
  // so that future versions of Nav and IE will show they are at
  // *least* JS 1.x capable. Always check for JS version compatibility
  // with > or >=.
  else if (this.nav && (this.major > 5)) this.js = 1.4
  else if (this.ie && (this.major > 5)) this.js = 1.3
  // HACK: no idea for other browsers; always check for JS version
  // with > or >=
  else this.js = 0.0;
  // *** PLATFORM ***
  this.win   = ( (agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1) );
  // NOTE: On Opera 3.0, the userAgent string includes "Windows 95/NT4" on all
  //        Win32, so you can't distinguish between Win95 and WinNT.
  this.win95=((agt.indexOf("win95")!=-1) || (agt.indexOf("windows 95")!=-1));
  // is this a 16 bit compiled version?
  this.win16 = ((agt.indexOf("win16")!=-1) ||
                (agt.indexOf("16bit")!=-1) ||
                (agt.indexOf("windows 3.1")!=-1) ||
                (agt.indexOf("windows 16-bit")!=-1) );
  this.win31 = ((agt.indexOf("windows 3.1")!=-1) ||
                (agt.indexOf("win16")!=-1) ||
                (agt.indexOf("windows 16-bit")!=-1));
  // NOTE: Reliable detection of Win98 may not be possible. It appears that:
  //       - On Nav 4.x and before you'll get plain "Windows" in userAgent.
  //       - On Mercury client, the 32-bit version will return "Win98", but
  //         the 16-bit version running on Win98 will still return "Win95".
  this.win98 = ((agt.indexOf("win98")!=-1) ||
                (agt.indexOf("windows 98")!=-1));
  this.winnt = ((agt.indexOf("winnt")!=-1) ||
                (agt.indexOf("windows nt")!=-1));
  this.win32 = ( this.win95 || this.winnt || this.win98 ||
                 ((this.major >= 4) && (navigator.platform == "Win32")) ||
                 (agt.indexOf("win32")!=-1) || (agt.indexOf("32bit")!=-1) );
  this.os2   = ((agt.indexOf("os/2")!=-1) ||
                (navigator.appVersion.indexOf("OS/2")!=-1) ||
                (agt.indexOf("ibm-webexplorer")!=-1));
  this.mac    = (agt.indexOf("mac")!=-1);
  this.mac68k = (this.mac && ((agt.indexOf("68k")!=-1) ||
                             (agt.indexOf("68000")!=-1)));
  this.macppc = (this.mac && ((agt.indexOf("ppc")!=-1) ||
                             (agt.indexOf("powerpc")!=-1)));
  this.sun   = (agt.indexOf("sunos")!=-1);
  this.sun4  = (agt.indexOf("sunos 4")!=-1);
  this.sun5  = (agt.indexOf("sunos 5")!=-1);
  this.suni86= (this.sun && (agt.indexOf("i86")!=-1));
  this.irix  = (agt.indexOf("irix") !=-1);    // SGI
  this.irix5 = (agt.indexOf("irix 5") !=-1);
  this.irix6 = ((agt.indexOf("irix 6") !=-1) || (agt.indexOf("irix6") !=-1));
  this.hpux  = (agt.indexOf("hp-ux")!=-1);
  this.hpux9 = (this.hpux && (agt.indexOf("09.")!=-1));
  this.hpux10= (this.hpux && (agt.indexOf("10.")!=-1));
  this.aix   = (agt.indexOf("aix") !=-1);      // IBM
  this.aix1  = (agt.indexOf("aix 1") !=-1);
  this.aix2  = (agt.indexOf("aix 2") !=-1);
  this.aix3  = (agt.indexOf("aix 3") !=-1);
  this.aix4  = (agt.indexOf("aix 4") !=-1);
  this.linux = (agt.indexOf("inux")!=-1);
  this.sco   = (agt.indexOf("sco")!=-1) || (agt.indexOf("unix_sv")!=-1);
  this.unixware = (agt.indexOf("unix_system_v")!=-1);
  this.mpras    = (agt.indexOf("ncr")!=-1);
  this.reliant  = (agt.indexOf("reliantunix")!=-1);
  this.dec   = ((agt.indexOf("dec")!=-1) || (agt.indexOf("osf1")!=-1) ||
       (agt.indexOf("dec_alpha")!=-1) || (agt.indexOf("alphaserver")!=-1) ||
       (agt.indexOf("ultrix")!=-1) || (agt.indexOf("alphastation")!=-1));
  this.sinix = (agt.indexOf("sinix")!=-1);
  this.freebsd = (agt.indexOf("freebsd")!=-1);
  this.bsd = (agt.indexOf("bsd")!=-1);
  this.unix  = ((agt.indexOf("x11")!=-1) || this.sun || this.irix ||
               this.hpux || this.sco ||this.unixware || this.mpras ||
               this.reliant || this.dec || this.sinix || this.aix ||
               this.linux || this.bsd || this.freebsd);
  this.vms   = ((agt.indexOf("vax")!=-1) || (agt.indexOf("openvms")!=-1));
}

You don't have to study this function too much. You can use is as is. It's good to notice the most common properties. For this DOM column, for example, we need to use the properties ie5up and nav5up. Here is how we use them in our Snakes game (main script):

var is;
is = new Is();
if (!(is.ie5up || is.nav5up)) alert("Snakes is supported
  by Version 5 and up only")
  // (The above two lines should be joined as one line.
  // They have been split for formatting purposes.)
else {

We first create an object is with the Is() function:

is = new Is(); 

We then check that either it is ie5up or nav5up, or else print an error message.

http://www.internet.com

Produced by Yehuda Shiran and Tomer Shiran

Created: August 16, 1999
Revised: August 16, 1999

URL: http://www.webreference.com/js/column46/sniffer.html