用戶代理檢測與瀏覽器Ua詳細分析


前言:用戶代理字符串與用戶代理檢測

“用戶代理字符串”(User Agent,下文簡稱“Ua”)是瀏覽器用來標識自身信息的一串字符

現如今,Ua一般包含有瀏覽器品牌、版本、內核、所在操作系統環境等信息

它也有着“悠久”而混亂的歷史

若您對這段“黑歷史”感興趣

推薦閱讀Hejin.Wong《用戶代理字符串簡史》一文,本文不再贅述

而“用戶代理檢測”則是通過檢測Ua來確定實際使用的瀏覽器及其內核等信息

本文將從瀏覽器內核和瀏覽器本身的角度出發

通過親測用戶代理字符串,梳理各主流瀏覽器(本文僅限桌面端)內核、版本等信息

以及分享通過JavaScript進行用戶代理檢測的方法

注:本文代碼基於[美]Nicholas C.ZakasJavaScript高級程序設計(第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內核的瀏覽器的代碼
   }
}

下文將會使用以下代碼alertUa等信息作為測試參考並提供截圖(點擊截圖可放大查看)

若您需要親測任何瀏覽器的信息,可將以下代碼粘貼於上文第一段代碼(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瀏覽器

排在第3456位的均是國產殼瀏覽器

再看一下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

Mozilla Firefox(火狐)是我個人最為崇敬的瀏覽器品牌

相比較而言,火狐瀏覽器性能優越、堅持標准、勇於嘗試(......好了,真心的,這可不是植入廣告)

它更擁有獨立的呈現引擎(內核)Gecko /ˈgekəʊ/

以下是我親測整理的火狐瀏覽器各主要版本Ua及通過Ua解析出的信息(點擊縮略圖可放大查看)

Mozilla Firefox 1.0
firefox1Ua firefox1
Mozilla/5.0 (Windows: U; Windows NT 5.1; zh-CN; rv:1.7.5) Gecko/20041124 Firefox/1.0
Mozilla Firefox 3.6
firefox3.6Ua firefox3.6
Mozilla/5.0 (Windows: U; Windows NT 6.0; zh-CN; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18
Mozilla Firefox 8.0
firefox8Ua firefox8
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0.1) Gecko/20100101 Firefox/8.0.1
Mozilla Firefox 36
firefox36Ua firefox36
Mozilla/5.0 (Windows NT 6.3; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0

通過如上親測和書本介紹可知,火狐瀏覽器的Ua具有如下特征

  1. 相對穩定,從第一個版本至今變化不大;
  2. 有正確標識版本、內核、所在操作系統等基本信息;
  3. 一直是以“Mozilla 5.0”開頭,今后估計也不會變化;
  4. Firefox 4后,“Gecko版本號”固定為“Gecko/20100101”,基本失去作用;
  5. 末尾“Firefox/”后內容為瀏覽器真實版本號;
  6. rv:”后內容為Gecko內核版本號;
  7. 高版本的Firefox瀏覽器“Gecko”內核版本號與瀏覽器版本號相同。

從用戶代理檢測的難度上說,得益於火狐瀏覽器一直堅持規矩

分析起來是最簡單的

運用如下JavaScript代碼,配合正則表達式

即可輕松的將火狐瀏覽器的相關信息賦給相應對象

/*以下代碼作用為判斷與分析火狐瀏覽器Ua信息*/
//...
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);
   }
}
//...

具體代碼本文第二部分“先看結論/可用代碼”已詳細給出,下同

Microsoft Internet Explorer

大名鼎鼎的IE瀏覽器可能也是一眾前端程序員的噩夢

雖然它版本迭代緩慢、Bug頻出、還有各種“怪癖”特性

但它倚仗Windows操作系統的壟斷地位,無論全球還是國內,從市場占有率上看一直是老大

IE瀏覽器也有自己的內核Trident /ˈtraɪdnt/

同樣根據“百度統計|流量研究院”的數據,看一下2014年國內瀏覽器按版本區分的市場份額占比情況

瀏覽器版本 市場份額
.IE8 32.04%
.Google Chrome 27.73%
.IE6 7.37%
.IE9 7.14%
.搜狗高速瀏覽器 4.77%
.IE7 3.48%
.獵豹瀏覽器 2.46%
.QQ瀏覽器 2.19%
.2345瀏覽器 1.67%
.其它 11.15%

什么?IE10IE11居然還沒排上號?

從數據上看,確實如此,老版本的IE(6/7/8/9)壽命是相當的長

這迫使前端開發必須考慮舊版本IE瀏覽器並為它的各個版本逐一DeBug和適配

下面通過親測,比較一下各版本IE瀏覽器Ua的差異

Internet Explorer 6
IE6Ua IE6
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Internet Explorer 7
IE7Ua IE7
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1)
Internet Explorer 8
IE8Ua IE8
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)
Internet Explorer 9
IE9Ua IE9
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; WOW64; Trident/5.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.30729)
Internet Explorer 10
IE10Ua IE10
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)
Internet Explorer 11
IE11Ua IE11
Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko

雖然稍顯凌亂,但觀察一下就能發現,IE6-10均有通過“MSIE”字段正確標識出當前IE版本

IE11(和接下來可能的IE12、13...)的Ua簡直亂入啊

目的很明顯,IE11試圖將自己偽裝成Gecko內核的瀏覽器(比如火狐),欺騙嗅探代碼

這繼續刷新着Ua本來就混亂的歷史,真是惹人嫌......

通過如上親測和書本介紹可知,IE瀏覽器的Ua具有如下特征

  1. IE6-10通過“MSIE”字段正確地標識自身版本信息;
  2. IE11通過“rv”字段標識自身版本信息;
  3. IE8及之后的版本添加了呈現引擎(Trident)的版本號,且Trident版本號都是IE版本號減4
  4. 有正確標識所在操作系統信息;
  5. IE11含有迷惑性字段“like Gecko”。

新增的Trident記號是為了讓開發人員知道IE是不是在兼容模式下運行

如下例所示,若是運行在兼容模式下的IE8,則“MSIE”版本號會變成7,但Trident及其版本號還會留在Ua

運行在兼容模式下的 IE8
IE8dUa IE8d
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0)

綜上比較,可以通過如下代碼進行針對IE的用戶代理檢測

/*以下代碼作用為判斷與分析IE瀏覽器Ua信息*/
//...
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);
}
//...

值得注意的是,以上代碼會根據“Trident內核版本號=IE版本號-4”的規律

IE6的“Trident”內核版本標記為“2.0”,將IE7的“Trident”內核版本標記為“3.0”,以此統一“Trident”標記

Google Chrome

從市場份額上看,無論是世界范圍內還是國內,PCGoogle Chrome都是僅次於IE的瀏覽器

不過這可能也與大多數國產套殼瀏覽器均使用ChromeWebKit內核有關

先看一下Google Chrome各主要版本Ua情況

Google Chrome 1
chrome1Ua chrome1
Mozilla/5.0 (Windows: U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.48 Safari/525.19
Google Chrome 10
chrome10Ua chrome10
Mozilla/5.0 (Windows: U; Windows NT 6.0; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16
Google Chrome 27
chrome27Ua chrome27
Mozilla/5.0 (Windows: U; Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36
Google Chrome 39
chrome39Ua chrome39
Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36

通過如上親測和書本介紹可知,Chrome瀏覽器的Ua具有如下特征

  1. 使用“AppleWebKit”字段正確標識所用內核為“WebKit”及其版本號;
  2. Chrome/”及其后數值正確標識了瀏覽器品牌及版本信息;
  3. 一直是以“Mozilla 5.0”開頭,今后估計也不會變化;
  4. 有正確標識所在操作系統信息;
  5. 均含有迷惑性字段“(KHTML, like Gecko)”;
  6. 末尾“Safari/”字段視圖將自己偽裝成SafariWebKit版本與Safari版本看起來似乎始終保持一致。

Chrome使用的呈現引擎(內核)是WebKit

但是,在Chrome 28之后,谷歌宣布將使用Blink引擎

不過Blink引擎也是基於WebKit的,關於更改引擎的變化,截至目前仍然沒有在Ua中表現出來

綜上,可以使用如下JavaScript代碼配合正則表達式進行針對Chrome瀏覽器的用戶代理檢測

/*以下代碼作用為判斷與分析Chrome瀏覽器Ua信息*/
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
      //...
   }else if(/Chrome\/(\S+)/.test(ua)){    //確定是不是Chrome
      browser.ver=RegExp["$1"];
      browser.chrome=parseFloat(browser.ver);
   }else if(/Version\/(\S+)/.test(ua)){   //確定是不是高版本(3+)的Safari
      //...
   }
//...

Apple Safari

蘋果Safari瀏覽器作為Mac OS系統的官方瀏覽器,自然也有可觀的用戶數

該瀏覽器也是基於WebKit內核

因為樓主還是大學生一枚,暫時買不起MacBook,安裝黑蘋果的過程又讓我累覺不愛......

所以關於SafariUa沒能測試得如其它瀏覽器般詳細

根據書本介紹,Safari 3.0之前的Ua類似如下所示

Mozilla/5.0 (Macintosh; U; PPC Mac OS X;en) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1

用了自己的電腦安裝了個Safari for Windows,借了同學一個MacBook做了如下親測

Apple Safari 5.1
safari5.1Ua safari5.1
Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/534.57.2 (KHTML,like Gecko) Version/5.1.7 Safari/534.57.2
Apple Safari 6
safari6Ua safari6
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1

根據書本介紹和如上親測,Safari瀏覽器的Ua具有如下特征

  1. 使用“AppleWebKit”字段正確標識所用內核為“WebKit”及其版本號;
  2. Safari”標識了瀏覽器品牌信息;
    (並不像Chrome瀏覽器一樣即包含“Chrome”字段又包含迷惑性“Safari”字段)
  3. Safari 3.0以上版本通過“Version字段正確標識瀏覽器版本信息(這只在Safari中存在);
  4. 一直是以“Mozilla 5.0”開頭,今后估計也不會變化;
  5. 有正確標識所在操作系統信息;
  6. 均含有迷惑性字段“(KHTML, like Gecko)”;

綜上,使用如下代碼配合正則表達式可以進行針對Safari瀏覽器的用戶代理檢測

/*以下代碼作用為判斷與分析Safari瀏覽器Ua信息*/
if(/AppleWebKit\/(\S+)/.test(ua)){        //匹配Webkit內核瀏覽器(Chrome、Safari、新Opera)
   engine.ver=RegExp["$1"];
   engine.webkit=parseFloat(engine.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;
   }
//...

其中,因為低版本Safari 2-不包含標識瀏覽器版本號的“version”屬性(不過如今低版本Safari用戶數應該極少了)

故只能使用一些if語句做近似判斷

Opera

Opera(歐朋)瀏覽器也算得上是瀏覽器界的一朵奇葩了

Opera 12.16之前,它有着自己的內核Presto /'prestəʊ/

而之后,Opera改用Google ChromeBlink內核(同樣基於WebKit

幾近淪為一款套殼瀏覽器

雖然根據上文數據,Opera瀏覽器在國內的市場份額幾乎可以忽略不計(被歸入了“其它”范疇)

但據說其在歐洲市場還是有相當的人氣,而且有着不同尋常的過去(自有內核)

所以本文還是將Opera單獨分析

Opera 9.6
opera9.6Ua opera9.6
Opera/9.64 (Windows NT 6.0; U; Edition IBIS; zh-cn) Presto/2.1.1
Opera 12.15
opera12Ua opera12
Opera/9.80 (Windows NT 6.1; Win64; x64) Presto/2.12.388 Version/12.15
Opera 26
opera26Ua opera26
Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60

從以上測試和書本介紹可以知道,在Opera 9之前,其默認的用戶代理字符串是所有現代瀏覽器中最合理的

沒有任何偽裝,且正確地標識了自身及其版本號

可是,因為因特網上不少瀏覽器嗅探代碼只鍾情於報告Mozilla產品名的那些Ua或只對IEGecko感興趣

Opera沒有偽裝的Ua可能令某些站點的兼容性出現問題

於是,Opera就開始變奇葩了......

Opera 9以后,出現了兩種修改用戶代理字符串的方式

第一種方式是,針對某些站點,將自身表示為另外一個瀏覽器,只不過在末尾追加Opera品牌和版本信息,如下為例

Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50

第二種方式是,針對某些站點,直接隱瞞身份,Ua與其它瀏覽器返回的相同

注意,這些奇葩行為都是針對某些站點的,這令用戶代理檢測識別Opera難上加難

不過,通過以上親測,還是可以總結出正常情況下OperaUa的一些特點

  1. Opera 9.8之前,Ua開頭的“Opera/”字段正確標識出了瀏覽器品牌和版本信息;
  2. Opera 9.8-12.15中,Ua開頭固定為“Opera/9.8,但有通過“Version”字段正確標識版本信息;
  3. Opera 12.15之前,一直有通過Presto字段正確地標識Presto內核及其版本信息;
  4. Opera 12.16后,因為使用了Blink(WebKit)內核,
    出現“AppleWebKit”字段正確標識內核及內核版本信息,
    同時出現“Chrome”、“Safari”、“(KHTML, like Gecko)”偽裝字段;
  5. 使用了Blink(Webkit)內核后,Ua末尾通過“OPR”字段標識瀏覽器品牌及版本信息;
  6. 一直有正確標識所在操作系統信息。

此外,Opera 5+獨家支持通過window.opera探測瀏覽器版本等信息

盡管無法通過用戶代理檢測獲得隱瞞身份狀態下的Opera信息

但還是可以根據以上規律,使用以下代碼檢測正常情況下OperaUa信息

/*以下代碼作用為判斷與分析Opera瀏覽器Ua信息*/
if(/AppleWebKit\/(\S+)/.test(ua)){      //匹配Webkit內核瀏覽器(Chrome、Safari、新Opera)
   engine.ver=RegExp["$1"];
   engine.webkit=parseFloat(engine.ver);
   //...
}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);
}
//...

呈現引擎(瀏覽器內核)

上文從瀏覽器的角度出發,分析了幾大世界知名瀏覽器的Ua

下面就從瀏覽器內核的角度,做一個簡單地整理

內核 瀏覽器
Webkit Google Chrome (Blink)
Apple Safari
Opera 12.16+ (Blink)
Trident Microsoft Internet Explorer
Gecko Mozilla Firefox
Presto Opera 12.15-

國產瀏覽器

國產瀏覽器全部都是套殼瀏覽器,都離不開上述內核

因為在國內,國產瀏覽器用戶數龐大,開發前端項目的過程中也不得不考慮國產瀏覽器所用的內核情況

下面將通過測試分析各主流國產瀏覽器Ua及內核情況(點擊縮略圖可放大查看)

QQ瀏覽器 qqBrowserUa Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; QQBrowser/8.0.2959.400; rv:11.0) like Gecko Trident
(調用系統IE內核)
百度瀏覽器 baiduBrowserUa Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/38.0.2125.122 BIDUBrowser/7.0 Safari/537.36 Blink
(WebKit)
UC瀏覽器 ucBrowserUa1 Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36 高速模式內核
WebKit
ucBrowserUa2 Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36(KHTML, like Gecko UBrowser/4.0.3214.0) Chrome/36.0.1985.143 Safari/537.36 Edge/12.0 兼容模式內核
Trident
(調用系統IE內核)
搜狗高速瀏覽器 sougouBrowserUa Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0 WebKit
獵豹安全瀏覽器 liebaoBrowserUa Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER WebKit
360安全瀏覽器 360BrowserUa1 Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 高速模式內核
WebKit
360BrowserUa2 Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko 兼容模式內核
Trident
(調用系統IE內核)
360極速瀏覽器 360BrowserUa3 Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 Blink
(WebKit)
2345王牌瀏覽器 2345BrowserUa1 Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko 高速模式內核
Trident
2345BrowserUa2 Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko 兼容模式內核
Trident
(調用系統IE內核)
2345加速瀏覽器 2345BrowserUa3 Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/31.0.1650.69 Safari/537.36 2345chrome v2.5.0.3895 WebKit

通過以上測試實踐,可以得出一些關於國產瀏覽器內核及Ua的結論

  1. 國產瀏覽器內核不是WebKit就是Trident(調用系統IE內核);
  2. 使用WebKit內核的國產瀏覽器最新版本的內核基本能保持接近Chrome最新版本內核;
  3. 部分國產瀏覽器沒有在Ua中標注自身信息
    使得開發者難以通過用戶代理檢測判斷用戶使用的國產瀏覽器類型

若使用上文中的代碼檢測國產瀏覽器品牌,則不是返回Chrome就是返回IE

這是因為只有一部分國產瀏覽器有在Ua中正確標注自身信息,難以准確檢測

不過其實也基本沒必要檢測到國產瀏覽器具體品牌,檢測其是什么內核比品牌重要吧

感慨一下,國產瀏覽器什么時候才能擁有自己的內核啊......

判斷操作系統

在本文“先看結論/可用代碼”部分中,還有一部分代碼是用於檢測Ua中包含的操作系統信息

根據常識,我們知道當前流行的操作系統有Windows XP/Vista/7/8/8.1/10Mac OSUnix

可以通過類似以下代碼檢測用戶當前使用的操作系統

/*以下代碼作用為檢測用戶當前使用的操作系統平台*/
//...
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);
//...

之所以是使用navigator.platform是因為這樣要比檢測用戶代理字符串更加簡單

navigator.platform屬性可能的值包括“Win32”、“Win64”、“MacPPC”、“MacIntel”、“X11”和"Linux i686"等

還好這些值在不同瀏覽器中都是一致的,使得檢測平台變得簡單

若用戶使用的是Windows平台,還可以通過Ua檢測其版本

需要注意的是,在Ua中,Windows的版本並不直觀,用來表示版本的數字其實是當前Windows內核版本

當前主流Windows版本及其內核對照表如下

版本 內核版本
Windows XP 5.1
Windows Vista 6.0
Windows 7 6.1
Windows 8 6.2
Windows 8.1 6.3
Windows 10 技術預覽版 6.4
Windows 10 (Build 9880+) 10

故可以通過類似以下代碼檢測用戶所在Windows平台的版本

/*以下代碼作用為檢測用戶使用的Windows版本*/
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"];
         }
      }
   }

[2015/01/16注:以上代碼測試並吸收了本文評論中@luobotang的建議,感謝反饋]

檢測用戶操作系統應該是統計作用大於功能作用吧!

隨筆感想

本文略長,不知有沒有人看到這里了呢?

看書本介紹關於Ua的知識,感覺略微過時了,想着自己整理一下

虛擬機搞呀搞,也沒想到倒飭了這么久才搞定,具體是做了幾天自己都忘了,此外排版綜合症又發作了......

其實也不知道做這件事情有沒有意義,只是喜歡就做做

不過強調一下,樓主只是大學菜鳥一只,本文所整理的內容雖多為實踐,但也可能有紕漏

若路過的大牛發現本文有什么問題,歡迎您不吝留言指正哦!我會及時修改的!

.
.
查看大圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM