“用户代理字符串”(User Agent,下文简称“Ua”)是浏览器用来标识自身信息的一串字符
现如今,Ua一般包含有浏览器品牌、版本、内核、所在操作系统环境等信息
它也有着“悠久”而混乱的历史
若您对这段“黑历史”感兴趣
推荐阅读Hejin.Wong《用户代理字符串简史》一文,本文不再赘述
而“用户代理检测”则是通过检测Ua来确定实际使用的浏览器及其内核等信息
本文将从浏览器内核和浏览器本身的角度出发
通过亲测用户代理字符串,梳理各主流浏览器(本文仅限桌面端)内核、版本等信息
注:本文代码基于[美]Nicholas C.Zakas《Javascript高级程序设计(第3版)》,并已根据现实情况进行优化
通过在JavaScript中引用以下代码
即可在需要的时候方便的测出用户所用浏览器的用户代理字符串、浏览器品牌、版本、内核等信息
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 //用户所用操作系统及版本信息 };}();
[2015/01/16注:以上代码测试并吸收了本文评论中@luobotang的建议,感谢反馈]
以上代码封装了一个命名为client的函数对象
实际开发中,引用了上述代码后,可以如下面示例代码所示,灵活运用client对象中的信息
if(client.engine.webkit){ //如果是基于Webkit内核的浏览器 if(client.browser.chrome){ //若是Google Chrome浏览器 //执行针对Chrome的代码 } else if {client.browser.safari}{ //执行针对Safari的代码 }} else if (client.engine.gecko){ //若是基于Cecko内核的浏览器 if(client.browser.firefox){ //执行针对Firefox的代码 } else { //执行针对其他基于Gecko内核的浏览器的代码 }}
下文将会使用以下代码alert出Ua等信息作为测试参考并提供截图(点击截图可放大查看)
若您需要亲测任何浏览器的信息,可将以下代码粘贴于上文第一段代码(client对象)后并在浏览器中运行
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);
首先通过数据了解一下目前浏览器市场份额现状
根据“百度统计|流量研究院”的数据
下图/表是2014年全年国内浏览器市场份额情况
浏览器名称 | 市场份额 |
---|---|
.Internet Explorer | 50.03% |
.Google Chrome | 27.73% |
.搜狗高速浏览器 | 4.77% |
.猎豹浏览器 | 2.46% |
.QQ浏览器 | 2.19% |
.2345浏览器 | 1.67% |
.其它 | 11.15% |
由此可以看出,在国内,IE浏览器占据了“大半江山”
紧随其后的是Google Chrome浏览器
排在第3、4、5、6位的均是国产壳浏览器
再看一下2014年11月全球浏览器市场份额情况(数据来自“浏览迷”)
浏览器名称 | 市场份额 |
---|---|
.Internet Explorer | 58.94% |
.Google Chrome | 20.57% |
.Firefox | 13.26% |
.Safari | 5.9% |
.Opera | 0.88% |
.其它 | 0.45% |
从全世界的范围上看,IE浏览器的市场份额更加可观,达到近6成
这些数据对于分析浏览器内核、生产兼容性强的前端项目具有重要的参考意义
Mozilla Firefox(火狐)是我个人最为崇敬的浏览器品牌
相比较而言,火狐浏览器性能优越、坚持标准、勇于尝试(......好了,真心的,这可不是植入广告)
它更拥有独立的呈现引擎(内核)Gecko /?gek??/
以下是我亲测整理的火狐浏览器各主要版本Ua及通过Ua解析出的信息(点击缩略图可放大查看)
Mozilla Firefox 1.0Mozilla/5.0 (Windows: U; Windows NT 5.1; zh-CN; rv:1.7.5) Gecko/20041124 Firefox/1.0
Mozilla Firefox 3.6
新闻热点
疑难解答