Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JavaScript 客户端检测
Search
anonymous
August 01, 2015
Programming
0
100
JavaScript 客户端检测
JavaScript 客户端检测——“用户代理检测”的注意要点 - 前端和Node学习笔记 - SegmentFault
anonymous
August 01, 2015
Tweet
Share
More Decks by anonymous
See All by anonymous
为什么我退出谷歌为自己工作
webgeeker
0
20
flutter-ui-succinctly
webgeeker
0
88
eu-14-Hayak-Same-Origin-Method-Execution-Some-Exploiting-A-Callback-For-Same-Origin-Policy-Bypass
webgeeker
1
100
try jquery part1
webgeeker
0
48
LARACON_2013.pdf
webgeeker
0
47
AngularJS 1
webgeeker
2
110
React
webgeeker
1
260
SVG for vector
webgeeker
2
120
REC-SVG11-20110816
webgeeker
0
62
Other Decks in Programming
See All in Programming
cXML という電子商取引の トランザクションを支える プロトコルと向きあっている話
phigasui
3
2.3k
「今のプロジェクトいろいろ大変なんですよ、app/services とかもあって……」/After Kaigi on Rails 2024 LT Night
junk0612
4
2.1k
광고 소재 심사 과정에 AI를 도입하여 광고 서비스 생산성 향상시키기
kakao
PRO
0
170
Streams APIとTCPフロー制御 / Web Streams API and TCP flow control
tasshi
2
340
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.2k
PLoP 2024: The evolution of the microservice architecture pattern language
cer
PRO
0
2.5k
JavaでLチカしたい! / JJUG CCC 2024 Fall LT
nhayato
0
120
EventSourcingの理想と現実
wenas
6
2.2k
Googleのテストサイズを活用したテスト環境の構築
toms74209200
0
300
Ethereum_.pdf
nekomatu
0
400
見せてあげますよ、「本物のLaravel批判」ってやつを。
77web
6
7.2k
Identifying User Idenity
moro
6
9.6k
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
409
22k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
700
How to train your dragon (web standard)
notwaldorf
88
5.7k
Building Applications with DynamoDB
mza
90
6.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
Facilitating Awesome Meetings
lara
50
6.1k
Faster Mobile Websites
deanohume
305
30k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Transcript
2016/6/13 JavaScript 客户端检测——“用户代理检测”的注意要点 前端和Node学习笔记 SegmentFault https://segmentfault.com/a/1190000004095133 1/11
home feed html5 css3 jquery php 文 JavaScript 客户端检测——“用户代理检 测”的注意要点 javascript Oliveryoung 2015年12月04日发布 推荐 0 推荐 已收藏 4 收藏,635 浏览 用户代理检测 通过 JavaScript 的 navigator.userAgent 属性访问。在服务器端,通过检测用户代理字符串来确定用户使用的浏览器 是一种常用的做法;但在客户端,用户代理检测一般为最低优先级。 用户代理字符串检测技术 首先要确定你需要多么具体的浏览器信息。然后在使用代码进行检测。 识别呈现引擎 原理 确切知道浏览器的名字和版本号不如确切知道它实用的是什么呈现引擎。目前只要检测五大呈现引擎即可:IE、 Gecko、WebKit、KHTML 和 Opera。(为了不在全局作用域中添加多余的变量,我们将使用模块增强模式来封装检 问答 文章 笔记 职位 活动 撰写
2016/6/13 JavaScript 客户端检测——“用户代理检测”的注意要点 前端和Node学习笔记 SegmentFault https://segmentfault.com/a/1190000004095133 2/11 测脚本。)基本代码如下:
做这样的区分可以支持像下面这样编写的代码: 检测顺序 关键是检测顺序要正确。由于用户代理字符串存在很多不一致的地方,如果检测顺序不对,很可能导致检测结果不正 确。 第一步要识别 Opera: var client = function(){ var engine = { ie: 0, gecko: 0, webkit: 0, khtml: 0, opera: 0, ver: null //完整的版本 }; return { engine: engine }; }(); if(client.engine.ie){ //针对 IE 的代码 }else if (client.engine.gecko > 0){ if (client.engine.ver == "1.8.1"){ //针对这个版本执行某些操作 } }
2016/6/13 JavaScript 客户端检测——“用户代理检测”的注意要点 前端和Node学习笔记 SegmentFault https://segmentfault.com/a/1190000004095133 3/11 第二步是
WebKit (检测字符串中的“AppleWebKit”): 第三步是 KHTML: 第四步是 Gecko: if (window.opera){ engine.ver = window.opera.version(); engine.opera = parseFloat(engine.ver); } var ua = navigator.userAgent; if (window.opera){ engine.ver = window.opera.version(); engine.opera = parseFloat(engine.ver); }else if (/AppleWebKit\/(\S+)/.test(ua)){ engine.ver = RegExp["$1"]; engine.webkit = parseFloat(engine.ver); } var ua = navigator.userAgent; if (window.opera){ engine.ver = window.opera.version(); engine.opera = parseFloat(engine.ver); }else if (/AppleWebKit\/(\S+)/.test(ua)){ engine.ver = RegExp["$1"]; engine.webkit = parseFloat(engine.ver); }else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){ engine.ver = RegExp["$1"]; engine.khtml = parseFloat(engine.ver); }
2016/6/13 JavaScript 客户端检测——“用户代理检测”的注意要点 前端和Node学习笔记 SegmentFault https://segmentfault.com/a/1190000004095133 4/11 第五步是
IE: 正则表达式 var ua = navigator.userAgent; if (window.opera){ engine.ver = window.opera.version(); engine.opera = parseFloat(engine.ver); }else if (/AppleWebKit\/(\S+)/.test(ua)){ engine.ver = RegExp["$1"]; engine.webkit = parseFloat(engine.ver); }else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){ engine.ver = RegExp["$1"]; engine.khtml = parseFloat(engine.ver); }else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){ engine.ver = RegExp["$1"]; engine.gecko = parseFloat(engine.ver); } var ua = navigator.userAgent; if (window.opera){ engine.ver = window.opera.version(); engine.opera = parseFloat(engine.ver); }else if (/AppleWebKit\/(\S+)/.test(ua)){ engine.ver = RegExp["$1"]; engine.webkit = parseFloat(engine.ver); }else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){ engine.ver = RegExp["$1"]; engine.khtml = parseFloat(engine.ver); }else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){ engine.ver = RegExp["$1"]; engine.gecko = parseFloat(engine.ver); }else if (/MSIE ([^;]+)/.test(ua)){ engine.ver = RegExp["$1"]; engine.ie = parseFloat(engine.ver); }
2016/6/13 JavaScript 客户端检测——“用户代理检测”的注意要点 前端和Node学习笔记 SegmentFault https://segmentfault.com/a/1190000004095133 5/11 各正则表达式如下:
(useragentstring.com这里列出了各种浏览器的版本以及用户代理字符串。) opera: Webkit: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 KHTML: 1. Mozilla/5.0 (X11; Linux) KHTML/4.9.1 (like Gecko) Konqueror/4.9 2. Mozilla/5.0 (compatible; Konqueror/4.5; FreeBSD) KHTML/4.5.4 (like Gecko) 对于第一种: 对于第二种: 不需要正则表达式,使用window.opera.verson(); AppleWebKit\/(\S+) //AppleWebKit/537.36 KHTML\/(\S+) //KHTML/4.9.1 Konqueror\/(\S+) //Konqueror/4.9 KHTML\/(\S+) //KHTML/4.5.4 Konqueror\/([^;]+) //Konqueror/4.5
2016/6/13 JavaScript 客户端检测——“用户代理检测”的注意要点 前端和Node学习笔记 SegmentFault https://segmentfault.com/a/1190000004095133 6/11 Gecko:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1 IE: 1. Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko 2. Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gppgba UNTRUSTED/1.0 对于第一种: 对于第二种: 识别浏览器 继续完善该代码: rv:([^\)]+)\) Gecko\/\d{8} //rv:40.0) Gecko/20100101 MSIE ([^,]+) //MSIE 11 MSIE ([^;]+) //MSIE 10.6
2016/6/13 JavaScript 客户端检测——“用户代理检测”的注意要点 前端和Node学习笔记 SegmentFault https://segmentfault.com/a/1190000004095133 7/11 由于大多数浏览器与其呈现引擎密切相关,所以下面示例中检测浏览器的代码与检测呈现引擎的代码是混合在一起
的。 var client = function(){ var engine = { ie: 0, gecko: 0, webkit: 0, khtml: 0, opera: 0, ver: null //完整的版本 }; var browser = { ie: 0, firefox: 0, safari: 0, konq: 0, opera: 0, chrome: 0, ver: null }; return { engine: engine
2016/6/13 JavaScript 客户端检测——“用户代理检测”的注意要点 前端和Node学习笔记 SegmentFault https://segmentfault.com/a/1190000004095133 8/11 识别平台
略 识别Windows操作系统 略 var ua = navigator.userAgent; if (window.opera){ engine.ver = browser.ver = window.opera.version(); engine.opera = browser.opera = parseFloat(engine.ver); }else if (/AppleWebKit\/(\S+)/.test(ua)){ engine.ver = RegExp["$1"]; engine.webkit = parseFloat(engine.ver); //确定是Chrome还是Safari if (/Chrome\/(\S+)/.test(ua)){ browser.ver = RegExp["$1"]; browser.chrome = parseInt(browser.ver); }else if(/Version\/(\S+)/.test(ua)){ browser.ver = RegExp["$1"]; browser.safari = parseInt(browser.ver); }else{ //近似的确定版本号 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; }
2016/6/13 JavaScript 客户端检测——“用户代理检测”的注意要点 前端和Node学习笔记 SegmentFault https://segmentfault.com/a/1190000004095133 9/11 2015年12月04日发布
提交评论 识别移动设备 略 识别游戏系统 略 0 推荐 已收藏 讨论区 更多 你可能感兴趣的文章 JavaScript客户端检测 2 收藏,254 浏览 JavaScript 离线应用与客户端存储——“应用缓存”的注意要点 1 收藏,188 浏览 ajax原理解析 JSONP(二) 20 收藏,1.6k 浏览 本文采用 署名非商业性使用相同方式共享 3.0 中国大陆许可协议,分享、演绎需署名且使用相同方式共享,不能用 于商业目的。 使用评论询问更多信息或提出修改意见,请不要在评论里回答问题
2016/6/13 JavaScript 客户端检测——“用户代理检测”的注意要点 前端和Node学习笔记 SegmentFault https://segmentfault.com/a/1190000004095133 10/11 换一组
新浪微博 微信 Twitter Facebook 本文隶属于专栏 前端和Node学习笔记 前端和PHP学习笔记 Oliveryoung 作者 关注专栏 相关收藏夹 AngularJS学习 4 个条目 | 0 人关注 amination 4 个条目 | 0 人关注 bind 7 个条目 | 0 人关注 分享扩散: 网站相关 关于我们 服务条款 帮助中心 联系合作 联系我们 加入我们 合作伙伴 常用链接 笔记插件: Chrome 笔记插件: Firefox 关注我们 Github Twitter 新浪微博 内容许可 除特别说明外,用户内容均采用 知识 共享署名相同方式共享 3.0 中国大陆 许可协议 进行许可 本站由 又拍云 提供 CDN 存储服务
2016/6/13 JavaScript 客户端检测——“用户代理检测”的注意要点 前端和Node学习笔记 SegmentFault https://segmentfault.com/a/1190000004095133 11/11 Copyright
© 20112016 SegmentFault. 当前呈现版本 16.06.07 浙ICP备 15005796号2 浙公网安备 33010602002000号 声望与权限 编辑器语法 每周精选 App 下载 媒体报道 建议反馈 Logo 下载 订阅:问答 / 文 章 SF 文档镜像 SF 社区访谈 技术沙龙 D DAY 黑客马拉松 Hackathon 域名搜索注册 SF 团队日志 产品技术日志 社区运营日志 市场运营日志