對於前端來講,瀏覽器檢測已經不陌生了,在作一些頁面是,須要針對不一樣的瀏覽器進行處理不一樣的邏輯,最簡單的就是區分pc和移動端的瀏覽器,或是android 和ios下的瀏覽器。css
1、瀏覽器檢測的由來?
在20世紀90年代初期,網景公司開發的 Netscape Navigator開始流行起來,隨後便產生的瀏覽器大戰,主要在於兩大巨頭之間(Netscape/微軟ie);因爲那時各家瀏覽器都有本身的標準,使用內核也不同,個版本之間也存在差別(萬惡的IE);形成網頁開發者須要針對不一樣的瀏覽器進行適配。後期產生了大量的瀏覽器廠商,各自都擁有本身的瀏覽器了,可是主要內核仍是仍是掌握在巨頭公司裏;
瀏覽器內核及常見瀏覽器:前端
其中咱們國內大部分瀏覽器基本都是使用雙內核(trident + webkit),當你開啓高速模式時,就是切換使用了webkit內核;固然不能一律而論,有些新版本使用了google研發的新的排版引擎 blinkjquery
2、navigator.userAgent產生?
navigator.userAgent最初是有網景公司的Netscape Navigator流行後,後續瀏覽器跟隨網景公司的格式進行模仿,例如,Netscape Navigator 3 發佈不久,微軟公佈了它的首款 web 瀏覽器: IE 3,可是 Netscape 是當時首選瀏覽器,大多數服務器在加載頁面前都會檢查 user-agent 是否爲該款瀏覽器。IE 若是不兼容Netscape user-agent 字串,使用 IE 的用戶就根本打不開這些頁面,因而造就了以下格式:
Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)
結果就是 IE 搖身一變被識別成了 Mozilla,假裝成 Netscape Navigator,這就是現在你們查看大部分瀏覽器的userAgen 字段中都會有「Mozilla/5.0」這樣的字符;linux
3、navigator.userAgent 格式 android
由於各大瀏覽器廠商在進行設置 userAgent 時都有本身的當心思,致使了userAgent 的格式也很是的混亂;好比上面說到的IE,爲了能讓IE用戶能夠訪問那時火熱的Netscape Navigator頁面,就假裝成了Netscape;蘋果公司在開發webkit 內核時,一個新的瀏覽器,怎麼樣才能破解這個被別人佔領的市場呢,那就是使用IE那一套,在userAgent中放了詳細的信息,假裝成了即兼容Mozilla又兼容Gecko內核的Firefox瀏覽器;ios
部分瀏覽器格式以下(PC):web
部分瀏覽器格式以下(移動端):chrome
4、解析userAgent進行瀏覽器檢測 windows
經過觀察各瀏覽器的userAgent字段,能夠從中進行細分瀏覽器類型;例如:瀏覽器
var platform_match = /(ipad)/.exec( ua ) || /(ipod)/.exec( ua ) || /(windows phone)/.exec( ua ) || // 區分windows phone手機 /(iphone)/.exec( ua ) || /(kindle)/.exec( ua ) || // 亞馬遜的 kindle /(silk)/.exec( ua ) || // 亞馬遜的 silk 瀏覽器 /(android)/.exec( ua ) || /(win)/.exec( ua ) || // windows 系統,注意必須放在 檢測 windows phone 手機以後 /(mac)/.exec( ua ) || /(linux)/.exec( ua ) || /(cros)/.exec( ua ) || /(playbook)/.exec( ua ) || // 黑莓的 playbook瀏覽器 /(bb)/.exec( ua ) || // 黑莓手機 /(blackberry)/.exec( ua ) || // 黑莓手機 []; // mobile 檢測 if ( browser.android || browser.bb || browser.blackberry || browser.ipad || browser.iphone || browser.ipod || browser.kindle || browser.playbook || browser.silk || browser[ "windows phone" ]) { browser.mobile = true; } // pc 檢測 if ( browser.cros || browser.mac || browser.linux || browser.win ) { browser.desktop = true; }
var match = /(edge)\/([\w.]+)/.exec( ua ) || /(opr)[\/]([\w.]+)/.exec( ua ) || /(chrome)[ \/]([\w.]+)/.exec( ua ) || /(iemobile)[\/]([\w.]+)/.exec( ua ) || /(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec( ua ) || /(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec( ua ) || /(webkit)[ \/]([\w.]+)/.exec( ua ) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || /(msie) ([\w.]+)/.exec( ua ) || ua.indexOf("trident") >= 0 && /(rv)(?::| )([\w.]+)/.exec( ua ) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || [];
5、精準度?
經過userAgent判斷能夠區分大部分瀏覽器,可是少數瀏覽器該字段的檢測會帶來誤區,特別是國內瀏覽器,開發頁面時須要針對具體的瀏覽器進行區分嗅探;
【參考連接】
①、browser.js : https://cdn.bootcss.com/jquery-browser/0.1.0/jquery.browser.js
②、簡書(經常使用瀏覽器的useragent):http://www.jianshu.com/p/126080096801
【結束語】
系列文章,包括了原創,翻譯,轉載等各種型的文章;一方面是爲了本身總結,另外一方面頁但願能夠共享知識;在技術方面有輸入,也要有所輸出,才能更進一步!文章基於本身的實踐、閱讀及理解,若有不合理及錯誤的地方,煩請各大佬評論指出,以便改正,感謝!