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
GitHubとGitLabとAWS CodePipelineでCI/CDを組み比べてみた
satoshi256kbyte
4
220
機能追加とリーダー業務の類似性
rinchoku
2
1.3k
Tool Catalog Agent for Bedrock AgentCore Gateway
licux
6
2.4k
パッケージ設計の黒魔術/Kyoto.go#63
lufia
3
430
Ruby Parser progress report 2025
yui_knk
1
430
アセットのコンパイルについて
ojun9
0
120
Cache Me If You Can
ryunen344
2
680
MCPでVibe Working。そして、結局はContext Eng(略)/ Working with Vibe on MCP And Context Eng
rkaga
5
2.2k
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
110
Ruby×iOSアプリ開発 ~共に歩んだエコシステムの物語~
temoki
0
270
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
310
2025 年のコーディングエージェントの現在地とエンジニアの仕事の変化について
azukiazusa1
24
12k
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
328
39k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
For a Future-Friendly Web
brad_frost
180
9.9k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
The Invisible Side of Design
smashingmag
301
51k
A Tale of Four Properties
chriscoyier
160
23k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
A designer walks into a library…
pauljervisheath
207
24k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
580
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
The Cost Of JavaScript in 2023
addyosmani
53
8.9k
KATA
mclloyd
32
14k
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 团队日志 产品技术日志 社区运营日志 市场运营日志