前言:用戶代理字符串與用戶代理檢測
“用戶代理字符串”(User Agent,下文簡稱“Ua”)是瀏覽器用來標識自身信息的一串字符
現如今,Ua一般包含有瀏覽器品牌、版本、內核、所在操作系統環境等信息
它也有着“悠久”而混亂的歷史
若您對這段“黑歷史”感興趣
推薦閱讀Hejin.Wong《用戶代理字符串簡史》一文,本文不再贅述
而“用戶代理檢測”則是通過檢測Ua來確定實際使用的瀏覽器及其內核等信息
本文將從瀏覽器內核和瀏覽器本身的角度出發
通過親測用戶代理字符串,梳理各主流瀏覽器(本文僅限桌面端)內核、版本等信息
以及分享通過JavaScript進行用戶代理檢測的方法
注:本文代碼基於[美]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
Mozilla Firefox(火狐)是我個人最為崇敬的瀏覽器品牌
相比較而言,火狐瀏覽器性能優越、堅持標准、勇於嘗試(......好了,真心的,這可不是植入廣告)
它更擁有獨立的呈現引擎(內核)Gecko /ˈgekəʊ/
以下是我親測整理的火狐瀏覽器各主要版本Ua及通過Ua解析出的信息(點擊縮略圖可放大查看)


Mozilla/5.0 (Windows: U; Windows NT 5.1; zh-CN; rv:1.7.5) Gecko/20041124 Firefox/1.0


Mozilla/5.0 (Windows: U; Windows NT 6.0; zh-CN; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18


Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0.1) Gecko/20100101 Firefox/8.0.1


Mozilla/5.0 (Windows NT 6.3; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
通過如上親測和書本介紹可知,火狐瀏覽器的Ua具有如下特征
- 相對穩定,從第一個版本至今變化不大;
- 有正確標識版本、內核、所在操作系統等基本信息;
- 一直是以“Mozilla 5.0”開頭,今后估計也不會變化;
- 從Firefox 4后,“Gecko版本號”固定為“Gecko/20100101”,基本失去作用;
- 末尾“Firefox/”后內容為瀏覽器真實版本號;
- “rv:”后內容為Gecko內核版本號;
- 高版本的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% |
什么?IE10、IE11居然還沒排上號?
從數據上看,確實如此,老版本的IE(6/7/8/9)壽命是相當的長
這迫使前端開發必須考慮舊版本IE瀏覽器並為它的各個版本逐一DeBug和適配
下面通過親測,比較一下各版本IE瀏覽器Ua的差異


Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)


Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1)


Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)


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)


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)


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具有如下特征
- IE6-10通過“MSIE”字段正確地標識自身版本信息;
- IE11通過“rv”字段標識自身版本信息;
- IE8及之后的版本添加了呈現引擎(Trident)的版本號,且Trident版本號都是IE版本號減4;
- 有正確標識所在操作系統信息;
- IE11含有迷惑性字段“like Gecko”。
新增的Trident記號是為了讓開發人員知道IE是不是在兼容模式下運行
如下例所示,若是運行在兼容模式下的IE8,則“MSIE”版本號會變成7,但Trident及其版本號還會留在Ua中


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
從市場份額上看,無論是世界范圍內還是國內,PC端Google Chrome都是僅次於IE的瀏覽器
不過這可能也與大多數國產套殼瀏覽器均使用Chrome的WebKit內核有關
先看一下Google Chrome各主要版本Ua情況


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


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


Mozilla/5.0 (Windows: U; Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36


Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
通過如上親測和書本介紹可知,Chrome瀏覽器的Ua具有如下特征
- 使用“AppleWebKit”字段正確標識所用內核為“WebKit”及其版本號;
- “Chrome/”及其后數值正確標識了瀏覽器品牌及版本信息;
- 一直是以“Mozilla 5.0”開頭,今后估計也不會變化;
- 有正確標識所在操作系統信息;
- 均含有迷惑性字段“(KHTML, like Gecko)”;
- 末尾“Safari/”字段視圖將自己偽裝成Safari,WebKit版本與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,安裝黑蘋果的過程又讓我累覺不愛......
所以關於Safari的Ua沒能測試得如其它瀏覽器般詳細
根據書本介紹,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做了如下親測


Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/534.57.2 (KHTML,like Gecko) Version/5.1.7 Safari/534.57.2


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具有如下特征
- 使用“AppleWebKit”字段正確標識所用內核為“WebKit”及其版本號;
- “Safari”標識了瀏覽器品牌信息;
(並不像Chrome瀏覽器一樣即包含“Chrome”字段又包含迷惑性“Safari”字段) - Safari 3.0以上版本通過“Version字段正確標識瀏覽器版本信息(這只在Safari中存在);
- 一直是以“Mozilla 5.0”開頭,今后估計也不會變化;
- 有正確標識所在操作系統信息;
- 均含有迷惑性字段“(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 Chrome的Blink內核(同樣基於WebKit)
幾近淪為一款套殼瀏覽器
雖然根據上文數據,Opera瀏覽器在國內的市場份額幾乎可以忽略不計(被歸入了“其它”范疇)
但據說其在歐洲市場還是有相當的人氣,而且有着不同尋常的過去(自有內核)
所以本文還是將Opera單獨分析


Opera/9.64 (Windows NT 6.0; U; Edition IBIS; zh-cn) Presto/2.1.1


Opera/9.80 (Windows NT 6.1; Win64; x64) Presto/2.12.388 Version/12.15


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或只對IE和Gecko感興趣
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難上加難
不過,通過以上親測,還是可以總結出正常情況下Opera的Ua的一些特點
- Opera 9.8之前,Ua開頭的“Opera/”字段正確標識出了瀏覽器品牌和版本信息;
- Opera 9.8-12.15中,Ua開頭固定為“Opera/9.8,但有通過“Version”字段正確標識版本信息;
- Opera 12.15之前,一直有通過Presto字段正確地標識Presto內核及其版本信息;
- Opera 12.16后,因為使用了Blink(WebKit)內核,
出現“AppleWebKit”字段正確標識內核及內核版本信息,
同時出現“Chrome”、“Safari”、“(KHTML, like Gecko)”偽裝字段; - 使用了Blink(Webkit)內核后,Ua末尾通過“OPR”字段標識瀏覽器品牌及版本信息;
- 一直有正確標識所在操作系統信息。
此外,Opera 5+獨家支持通過window.opera探測瀏覽器版本等信息
盡管無法通過用戶代理檢測獲得隱瞞身份狀態下的Opera信息
但還是可以根據以上規律,使用以下代碼檢測正常情況下Opera的Ua信息
/*以下代碼作用為判斷與分析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及內核情況(點擊縮略圖可放大查看)
![]() |
|||
---|---|---|---|
![]() |
![]() |
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內核) |
![]() |
|||
---|---|---|---|
![]() |
![]() |
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) |
![]() |
|||
---|---|---|---|
![]() |
![]() |
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 | |||
![]() |
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內核) |
![]() |
|||
---|---|---|---|
![]() |
![]() |
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 |
![]() |
|||
---|---|---|---|
![]() |
![]() |
Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER |
WebKit |
![]() |
|||
---|---|---|---|
![]() |
![]() |
Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 |
高速模式內核 |
WebKit | |||
![]() |
Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko |
兼容模式內核 | |
Trident (調用系統IE內核) |
|||
![]() |
![]() |
Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 |
Blink (WebKit) |
![]() |
|||
---|---|---|---|
![]() |
![]() |
Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko |
高速模式內核 |
Trident | |||
![]() |
Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko |
兼容模式內核 | |
Trident (調用系統IE內核) |
|||
![]() |
![]() |
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的結論
- 國產瀏覽器內核不是WebKit就是Trident(調用系統IE內核);
- 使用WebKit內核的國產瀏覽器最新版本的內核基本能保持接近Chrome最新版本內核;
- 部分國產瀏覽器沒有在Ua中標注自身信息
使得開發者難以通過用戶代理檢測判斷用戶使用的國產瀏覽器類型
若使用上文中的代碼檢測國產瀏覽器品牌,則不是返回Chrome就是返回IE
這是因為只有一部分國產瀏覽器有在Ua中正確標注自身信息,難以准確檢測
不過其實也基本沒必要檢測到國產瀏覽器具體品牌,檢測其是什么內核比品牌重要吧
感慨一下,國產瀏覽器什么時候才能擁有自己的內核啊......
判斷操作系統
在本文“先看結論/可用代碼”部分中,還有一部分代碼是用於檢測Ua中包含的操作系統信息
根據常識,我們知道當前流行的操作系統有Windows XP/Vista/7/8/8.1/10、Mac OS、Unix等
可以通過類似以下代碼檢測用戶當前使用的操作系統
/*以下代碼作用為檢測用戶當前使用的操作系統平台*/ //... 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的知識,感覺略微過時了,想着自己整理一下
虛擬機搞呀搞,也沒想到倒飭了這么久才搞定,具體是做了幾天自己都忘了,此外排版綜合症又發作了......
其實也不知道做這件事情有沒有意義,只是喜歡就做做
不過強調一下,樓主只是大學菜鳥一只,本文所整理的內容雖多為實踐,但也可能有紕漏
若路過的大牛發現本文有什么問題,歡迎您不吝留言指正哦!我會及時修改的!