Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
JavaScript 客户端检测
Search
anonymous
August 01, 2015
Programming
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JavaScript 客户端检测
JavaScript 客户端检测——“用户代理检测”的注意要点 - 前端和Node学习笔记 - SegmentFault
anonymous
August 01, 2015
More Decks by anonymous
See All by anonymous
为什么我退出谷歌为自己工作
webgeeker
0
59
flutter-ui-succinctly
webgeeker
0
140
eu-14-Hayak-Same-Origin-Method-Execution-Some-Exploiting-A-Callback-For-Same-Origin-Policy-Bypass
webgeeker
1
110
try jquery part1
webgeeker
0
61
LARACON_2013.pdf
webgeeker
0
63
AngularJS 1
webgeeker
2
130
React
webgeeker
1
320
SVG for vector
webgeeker
2
140
REC-SVG11-20110816
webgeeker
0
82
Other Decks in Programming
See All in Programming
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
300
AI活用は、個人から組織へ|マルチプレイヤーエージェントハーネス「QM」の社内活用事例 / AI use is moving from individuals to orgs
rkaga
1
140
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.4k
Building an Out-of-Order CPU
latte72
1
790
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
250
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
850
一人だけ、Kiroが静止する日
hideg
0
120
Verilogで学ぶCPU自作入門.pdf
uyuki234
1
450
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
850
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
250
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
270
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
280
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Become a Pro
speakerdeck
PRO
31
6.3k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
910
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Six Lessons from altMBA
skipperchong
29
4.5k
Done Done
chrislema
186
17k
Why Our Code Smells
bkeepers
PRO
340
58k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
How STYLIGHT went responsive
nonsquared
100
6.3k
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 团队日志 产品技术日志 社区运营日志 市场运营日志