JavaScript客户端检测

来源:互联网 发布:显卡升级软件下载 编辑:程序博客网 时间:2024/05/22 20:34

客户端检测-筆記

《JavaScript 高级程序设计——第9章》


优先采用能力检测和怪癖检测。

//检测浏览器下测试任何对象的某个特性是否存在——不保证永远可靠//该方法目前(书中):可靠// 作者: Peter Michauxfunction isHostMethod(object, property) {  var t = typeof object[property];  return t == 'function' ||    (!!(t == 'object' && object[property])) ||    t == 'unknown';}result = isHostMethod(xhr, "open");result = isHostMethod(xhr, "foo");

一次性檢測

var hasNsPlug = !!(navigator.plugins && navigator.plugins.length);// 確定瀏覽器是否支持Netscape風格的插件
var hasDOM1 = !!(document.getElementById && document.createElement && document.getElementsByTagName);//確定瀏覽器是否具有DOM1級規定的能力

怪癖檢測(bug檢測)

var hasDontEnumQuirk = function() {  for (var prop in o) {    if (prop == "toString") {      return false;    }  }  return true;}()

用戶代理檢測

var client=function(){   var engine={    //呈现引擎      trident:0,      gecko:0,      webkit:0,      khtml:0,      presto:0,      ver:null     //具体的版本号   };   var browser={   //浏览器      ie:0,      firefox:0,      safari:0,      konq:0,      opera:0,      chrome:0,      ver:null     //具体的版本号   };   var system={    //操作系统      win:false,      mac:false,      x11:false   };   var ua=navigator.userAgent;   if(/AppleWebKit\/(\S+)/.test(ua)){        //匹配Webkit内核浏览器(Chrome、Safari、新Opera)      engine.ver=RegExp["$1"];      engine.webkit=parseFloat(engine.ver);      if(/OPR\/(\S+)/.test(ua)){             //确定是不是引用了Webkit内核的Opera         browser.ver=RegExp["$1"];         browser.opera=parseFloat(browser.ver);      }else if(/Chrome\/(\S+)/.test(ua)){    //确定是不是Chrome         browser.ver=RegExp["$1"];         browser.chrome=parseFloat(browser.ver);      }else if(/Version\/(\S+)/.test(ua)){   //确定是不是高版本(3+)的Safari         browser.ver=RegExp["$1"];         browser.safari=parseFloat(browser.ver);      }else{                                 //近似地确定低版本Safafi版本号         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(window.opera){                 //只匹配拥有Presto内核的老版本Opera 5+(12.15-)      engine.ver=browser.ver=window.opera.version();      engine.presto=browser.opera=parseFloat(engine.ver);   }else if(/Opera[\/\s](\S+)/.test(ua)){  //匹配不支持window.opera的Opera 5-或伪装的Opera      engine.ver=browser.ver=RegExp["$1"];      engine.presto=browser.opera=parseFloat(engine.ver);   }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)){ //判断是不是基于Gecko内核      engine.ver=RegExp["$1"];      engine.gecko=parseFloat(engine.ver);      if(/Firefox\/(\S+)/.test(ua)){                //确定是不是Firefox         browser.ver=RegExp["$1"];         browser.firefox=parseFloat(browser.ver);      }   }else if(/Trident\/([\d\.]+)/.test(ua)){         //确定是否是Trident内核的浏览器(IE8+)      engine.ver=RegExp["$1"];      engine.trident=parseFloat(engine.ver);      if(/rv\:([\d\.]+)/.test(ua)||/MSIE ([^;]+)/.test(ua)){   //匹配IE8-11+         browser.ver=RegExp["$1"];         browser.ie=parseFloat(browser.ver);      }   }else if(/MSIE ([^;]+)/.test(ua)){               //匹配IE6、IE7      browser.ver=RegExp["$1"];      browser.ie=parseFloat(browser.ver);      engine.ver=browser.ie-4.0;                    //模拟IE6、IE7中的Trident值      engine.trident=parseFloat(engine.ver);   }   var p=navigator.platform;                        //判断操作系统   system.win=p.indexOf("Win")==0;   system.mac=p.indexOf("Mac")==0;   system.x11=(p.indexOf("X11")==0)||(p.indexOf("Linux")==0);   if(system.win){      if(/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)){         if(RegExp["$1"]=="NT"){            system.win = ({               "5.0" : "2000",               "5.1" : "XP",               "6.0" : "Vista",               "6.1" : "7",               "6.2" : "8",               "6.3" : "8.1",               "10" : "10"            })[RegExp["$2"]] || "NT";         }else if(RegExp["$1"]=="9x"){            system.win="ME";         }else{            system.win=RegExp["$1"];         }      }   }   return {      ua:ua,          //用户浏览器Ua原文      engine:engine,  //包含着用户浏览器引擎(内核)信息      browser:browser,//包括用户浏览器品牌与版本信息      system:system   //用户所用操作系统及版本信息   };}();
alert(client.ua);var browserName="";             //保存当前使用的浏览器品牌信息var browserVer=0;               //保存当前使用的浏览器版本信息for(var i in client.browser){   if(client.browser[i]){      browserName=i;      browserVer=client.browser[i];      break;   }}var useEngine="";               //保存当前浏览器引擎(内核)名称var engineVer=0;                //保存当前使用的浏览器引擎版本for(var i in client.engine){   if(client.engine[i]){      useEngine=i;      engineVer=client.engine[i];      break;   }}var useSystem="";               //保存当前操作系统信息for(var i in client.system){   if(client.system[i]){      i== "win"?useSystem = "Windows "+client.system[i]:useSystem=i;      break;   }}alert( "当前使用的浏览器:"+browserName     + "\n浏览器版本:"+browserVer     + "\n浏览器内核:"+useEngine     + "\n内核版本:"+engineVer     + "\n当前操作系统:"+useSystem);