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
26
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
49
LARACON_2013.pdf
webgeeker
0
50
AngularJS 1
webgeeker
2
110
React
webgeeker
1
300
SVG for vector
webgeeker
2
120
REC-SVG11-20110816
webgeeker
0
63
Other Decks in Programming
See All in Programming
#kanrk08 / 公開版 PicoRubyとマイコンでの自作トレーニング計測装置を用いたワークアウトの理想と現実
bash0c7
1
880
新メンバーも今日から大活躍!SREが支えるスケールし続ける組織のオンボーディング
honmarkhunt
5
8k
初学者でも今すぐできる、Claude Codeの生産性を10倍上げるTips
s4yuba
16
12k
設計やレビューに悩んでいるPHPerに贈る、クリーンなオブジェクト設計の指針たち
panda_program
6
2.3k
チームのテスト力を総合的に鍛えて品質、スピード、レジリエンスを共立させる/Testing approach that improves quality, speed, and resilience
goyoki
5
990
코딩 에이전트 체크리스트: Claude Code ver.
nacyot
0
840
AIともっと楽するE2Eテスト
myohei
7
2.9k
Agentic Coding: The Future of Software Development with Agents
mitsuhiko
0
120
TypeScriptでDXを上げろ! Hono編
yusukebe
1
400
ソフトウェア品質を数字で捉える技術。事業成長を支えるシステム品質の マネジメント
takuya542
2
14k
Railsアプリケーションと パフォーマンスチューニング ー 秒間5万リクエストの モバイルオーダーシステムを支える事例 ー Rubyセミナー 大阪
falcon8823
5
1.4k
Git Sync を超える!OSS で実現する CDK Pull 型デプロイ / Deploying CDK with PipeCD in Pull-style
tkikuc
3
150
Featured
See All Featured
Writing Fast Ruby
sferik
628
62k
How to Think Like a Performance Engineer
csswizardry
25
1.7k
Faster Mobile Websites
deanohume
307
31k
A Tale of Four Properties
chriscoyier
160
23k
Unsuck your backbone
ammeep
671
58k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
Documentation Writing (for coders)
carmenintech
72
4.9k
Bash Introduction
62gerente
613
210k
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 团队日志 产品技术日志 社区运营日志 市场运营日志