1. Capability test
The goal of capability testing is not to identify a specific browser, but to identify the capability of the browser. When possible, try to use typeof for capability testing. To test whether a property of any object exists in the browser environment, use the following function:
function isHostMethod(object,property) { var t = typeof object[property]; return t=='function' || (!!(t=='object' && object[[property]])) || t=='unknown'; } result = isHostMethod(xhr,"open"); //true result = isHostMethod(xhr,"foo"); //false
2. Quirky test
The goal of quirks detection is to identify the particularity of the browser. Quirks are actually bug s in the browser implementation.
3. User agent detection
Identify the browser by detecting the user agent string. The user agent string contains a lot of browser related information, including browser, platform, operating system and browser version.
(1) recognition and presentation engine
(2) identify browser
(3) identification platform
(4) identify the Winidows operating system
(5) identify mobile devices
(6) identify game system
The complete code is as follows:
var client = function(){ //Rendering engine var engine = { ie: 0, gecko: 0, webkit: 0, khtml: 0, opera: 0, //Full version number ver: null }; //Browser var browser = { //Main browser ie: 0, firefox: 0, safari: 0, konq: 0, opera: 0, chrome: 0, //Specific version No. ver: null }; //Platforms, devices and operating systems var system = { win: false, mac: false, x11: false, //Mobile devices iphone: false, ipod: false, ipad: false, ios: false, android: false, nokiaN: false, winMobile: false, //Game system wii: false, ps: false }; //Detect rendering engine and browser var ua = navigator.userAgent; if (window.opera){ engine.ver = browser.ver = window.opera.version(); engine.opera = browser.opera = parseFloat(engine.ver); } else if (/AppleWebKit\/(\S+)/.test(ua)){ engine.ver = RegExp["$1"]; engine.webkit = parseFloat(engine.ver); //Determine whether it's chrome or safari if (/Chrome\/(\S+)/.test(ua)){ browser.ver = RegExp["$1"]; browser.chrome = parseFloat(browser.ver); } else if (/Version\/(\S+)/.test(ua)){ browser.ver = RegExp["$1"]; browser.safari = parseFloat(browser.ver); } else { //Approximately determine version good = number var safariVersion = 1; if (engine.webkit < 100){ safariVersion = 1; } else if (engine.webkit < 312){ safariVersion = 1.2; } else if (engine.webkit < 412){ safariVersion = 1.3; } else { safariVersion = 2; } browser.safari = browser.ver = safariVersion; } } else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){ engine.ver = browser.ver = RegExp["$1"]; engine.khtml = browser.konq = parseFloat(engine.ver); } else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){ engine.ver = RegExp["$1"]; engine.gecko = parseFloat(engine.ver); //Make sure it's Firefox if (/Firefox\/(\S+)/.test(ua)){ browser.ver = RegExp["$1"]; browser.firefox = parseFloat(browser.ver); } } else if (/MSIE ([^;]+)/.test(ua)){ engine.ver = browser.ver = RegExp["$1"]; engine.ie = browser.ie = parseFloat(engine.ver); } //Detect browser browser.ie = engine.ie; browser.opera = engine.opera; //Detection platform var p = navigator.platform; system.win = p.indexOf("Win") == 0; system.mac = p.indexOf("Mac") == 0; system.x11 = (p == "X11") || (p.indexOf("Linux") == 0); //Testing windows operating system if (system.win){ if (/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)){ if (RegExp["$1"] == "NT"){ switch(RegExp["$2"]){ case "5.0": system.win = "2000"; break; case "5.1": system.win = "XP"; break; case "6.0": system.win = "Vista"; break; case "6.1": system.win = "7"; break; default: system.win = "NT"; break; } } else if (RegExp["$1"] == "9x"){ system.win = "ME"; } else { system.win = RegExp["$1"]; } } } //Mobile devices system.iphone = ua.indexOf("iPhone") > -1; system.ipod = ua.indexOf("iPod") > -1; system.ipad = ua.indexOf("iPad") > -1; system.nokiaN = ua.indexOf("NokiaN") > -1; //windows mobile if (system.win == "CE"){ system.winMobile = system.win; } else if (system.win == "Ph"){ if(/Windows Phone OS (\d+.\d+)/.test(ua)){; system.win = "Phone"; system.winMobile = parseFloat(RegExp["$1"]); } } //Detect iOS version if (system.mac && ua.indexOf("Mobile") > -1){ if (/CPU (?:iPhone )?OS (\d+_\d+)/.test(ua)){ system.ios = parseFloat(RegExp.$1.replace("_", ".")); } else { system.ios = 2; //We can't really detect it, so we can only guess. } } //Check Android version if (/Android (\d+\.\d+)/.test(ua)){ system.android = parseFloat(RegExp.$1); } //Game system system.wii = ua.indexOf("Wii") > -1; system.ps = /playstation/i.test(ua); //Return these objects return { engine: engine, browser: browser, system: system }; }();