对于前端来讲,浏览器检测已经不陌生了,在作一些页面是,须要针对不一样的浏览器进行处理不一样的逻辑,最简单的就是区分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
【结束语】
系列文章,包括了原创,翻译,转载等各种型的文章;一方面是为了本身总结,另外一方面页但愿能够共享知识;在技术方面有输入,也要有所输出,才能更进一步!文章基于本身的实践、阅读及理解,若有不合理及错误的地方,烦请各大佬评论指出,以便改正,感谢!