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
110
JavaScript 客户端检测
JavaScript 客户端检测——“用户代理检测”的注意要点 - 前端和Node学习笔记 - SegmentFault
anonymous
August 01, 2015
Tweet
Share
More Decks by anonymous
See All by anonymous
为什么我退出谷歌为自己工作
webgeeker
0
27
flutter-ui-succinctly
webgeeker
0
110
eu-14-Hayak-Same-Origin-Method-Execution-Some-Exploiting-A-Callback-For-Same-Origin-Policy-Bypass
webgeeker
1
100
try jquery part1
webgeeker
0
50
LARACON_2013.pdf
webgeeker
0
51
AngularJS 1
webgeeker
2
110
React
webgeeker
1
300
SVG for vector
webgeeker
2
130
REC-SVG11-20110816
webgeeker
0
65
Other Decks in Programming
See All in Programming
私達はmodernize packageに夢を見るか feat. go/analysis, go/ast / Go Conference 2025
kaorumuta
2
530
Introducing ReActionView: A new ActionView-Compatible ERB Engine @ Kaigi on Rails 2025, Tokyo, Japan
marcoroth
3
1k
XP, Testing and ninja testing ZOZ5
m_seki
3
620
非同期jobをtransaction内で 呼ぶなよ!絶対に呼ぶなよ!
alstrocrack
0
710
Advance Your Career with Open Source
ivargrimstad
0
480
育てるアーキテクチャ:戦い抜くPythonマイクロサービスの設計と進化戦略
fujidomoe
1
170
Pull-Requestの内容を1クリックで動作確認可能にするワークフロー
natmark
2
490
タスクの特性や不確実性に応じた最適な作業スタイルの選択(ペアプロ・モブプロ・ソロプロ)と実践 / Optimal Work Style Selection: Pair, Mob, or Solo Programming.
honyanya
3
160
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
1
430
SpecKitでどこまでできる? コストはどれくらい?
leveragestech
0
690
AI Coding Meetup #3 - 導入セッション / ai-coding-meetup-3
izumin5210
0
3.3k
uniqueパッケージの内部実装を支えるweak pointerの話
magavel
0
980
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
jQuery: Nuts, Bolts and Bling
dougneiner
65
7.9k
A Tale of Four Properties
chriscoyier
161
23k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.5k
Being A Developer After 40
akosma
91
590k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Optimizing for Happiness
mojombo
379
70k
Six Lessons from altMBA
skipperchong
28
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 团队日志 产品技术日志 社区运营日志 市场运营日志