spacer

Webref WebRef   Sitemap · Experts · Tools · Services · Newsletters · About i.com

home / experts / javascript / column46


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

Developer News
News Flash: Adobe Has iPhone Workaround
Adobe's Flash 10.1 Goes Mobile (Minus iPhone)
A Salute to Visionary CEOs

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

internet.commediabistro.comJusttechjobs.comGraphics.com

Search:

WebMediaBrands Corporate Info

Legal Notices, Licensing, Reprints, Permissions, Privacy Policy.
Advertise | Newsletters | Shopping | E-mail Offers | Freelance Jobs

webref The latest from WebReference.com Browse >
Building a Banking Application Home Page with OOP · Mixing Scripting Languages · Review: phpFox, a Social Networking CMS with all the Bells and Whistles
Sitemap · Experts · Tools · Services · Email a Colleague · Contact FREE Newsletters 
 The latest from internet.com
Enterprise 2.0: Social Networking in the Cloud · BroadSoft Marketplace Hastens Pace of Telephony Innovation · Review: HTC Hero for Sprint


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

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