客户端检测经常用的方法:能力检测、怪癖检测和用户代理检测。

能力检测:在写代码前先检测浏览器的能力。

怪癖检测:实际上是浏览器现存的bug。

用户代理检测:通过检测用户代理字符串来识别浏览器。

一般优先考虑使用 能力检测,怪癖检测是第二种选择,用户代理检测是最后一种方案。

  1 var client = function () {
2 // 引擎
3 var engine = {
4 ie: 0,
5 gecko: 0,
6 webkit: 0,
7 khtml: 0,
8 opera: 0,
9 version: null // 版本号
10 };
11 // 浏览器
12 var brower = {
13 ie: 0,
14 firefox: 0,
15 safari: 0,
16 konq: 0,
17 opera: 0,
18 chrome: 0,
19 version: null // 版本号
20 };
21
22 // 平台、设备、操作系统
23 var system = {
24 win: false,
25 mac: false,
26 xll: false,// Unix
27
28 // 移动设备
29 iphone: false,
30 ipod: false,
31 ipad: false,
32 ios: false,
33 android: false,
34 nokiaN: false,// 诺基亚N系列手机
35 winMobile: false,
36
37 // 游戏系统
38 wii: false,// 任天堂
39 ps: false
40 };
41
42 // 检测引擎和浏览器
43 var ua = navigator.userAgent;
44 if (window.opera) {
45 engine.version = brower.version = window.opera.version();
46 engine.opera = brower.opera = parseFloat(engine.version);
47 } else if (/AppleWebKit\/(\S+)/.test(ua)) {
48 engine.version = RegExp["$1"];
49 engine.webkit = parseFloat(engine.version);
50
51 // chrome or safari
52 if (/Chrome\/(\S+)/.test(ua)) {
53
54 if (/Edg\/(\S+)/ig.test(ua)) {
55 engine.version = brower.version = RegExp["$1"];
56 engine.ie = brower.ie = parseFloat(engine.version);
57 } else {
58 brower.version = RegExp["$1"];
59 brower.chrome = parseFloat(brower.version);
60 }
61 } else if (/Version\/(\S+)/.test(ua)) {
62 brower.version = RegExp["$1"];
63 brower.safari = parseFloat(brower.version);
64 } else {
65 // 近似确定版本号
66 var safariVersion = 1;
67 if (engine.webkit < 100) {
68 safariVersion = 1;
69 } else if (engine.webkit < 312) {
70 safariVersion = 1.2;
71 } else if (engine.webkit < 412) {
72 safariVersion = 1.3;
73 } else {
74 safariVersion = 3;
75 }
76 brower.safari = brower.version = safariVersion;
77 }
78 } else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)) {
79 engine.version = brower.version = RegExp["$1"];
80 engine.khtml = brower.konq = parseFloat(brower.version);
81
82 } else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) {
83 engine.version = RegExp["$1"];
84 engine.gecko = parseFloat(engine.version);
85
86 // 确定是否是Firefox
87 if (/FireFox\/(\S+)/.test(ua)) {
88 brower.version = RegExp["$1"];
89 brower.firefox = parseFloat(brower.version);
90 }
91
92 } else if (/MSIE ([^;]+)/.test(ua)) {
93 // 不适用IE11和Edge
94 engine.version = brower.version = RegExp["$1"];
95 engine.ie = brower.ie = parseFloat(engine.version);
96 } else if (/rv:([^\)]+)\)/.test(ua)) {
97 // 判断IE11
98 engine.version = brower.version = RegExp["$1"];
99 engine.ie = brower.ie = parseFloat(engine.version);
100 }
101
102
104 // 检测浏览器
105 brower.ie = engine.ie;
106 brower.opera = engine.opera;
107
108 // 检测平台
109 var p = navigator.platform;
110 system.win = p.indexOf("Win") == 0;
111 system.mac = p.indexOf("Mac") == 0;
112 system.xll = (p.indexOf("Linux") == 0) || (p == "Xll");
113
114 // 检测windows操作系统
115 if (system.win) {
116 if (/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)) {
117 if (RegExp["$1"] == "NT") {
118 switch (RegExp["$2"]) {
119 case "5.0":
120 system.win = "2000";
121 break;
122 case "5.1":
123 system.win = "XP";
124 break;
125 case "6.0":
126 system.win = "Vista";
127 break;
128 case "6.1":
129 system.win = "7";
130 break;
131 default:
132 system.win = "NT";
133 break;
134
135 }
136 } else if (RegExp["$1"] == "9x") {
137 system.win = "ME";
138 } else {
139 system.win = RegExp["$1"]
140 }
141 }
142 }
143
144 // 移动设备
145 system.iphone = ua.indexOf("iPhone") > -1;
146 system.ipod = ua.indexOf("iPod") > -1;
147 system.ipad = ua.indexOf("iPad") > -1;
148 system.nokiaN = ua.indexOf("NokiaN") > -1;
149
150 // windows phone
151 if (system.win == "CE") {
152 system.winMobile = system.win;
153 } else if (system.win == "Ph") {
154 if (/Windows Phone OS (\d+.\d+)/.test(us)) {
155 system.win = "Phone";
156 system.winMobile = parseFloat(RegExp["$1"])
157 }
158 }
159
160 // 检测IOS版本
161 if (system.mac && ua.indexOf("Mobile") > -1) {
162 if (/CPU (?:iPhone )?OS (\d+_\d+)/.test(ua)) {
163 system.ios = parseFloat(RegExp.$1.replace("_", "."));
164
165 } else {
166 system.ios = 2;
167 }
168 }
169
170 // 检测Android版本
171 if (/Android (\d+\.\d+)/.test(ua)) {
172 system.android = parseFloat(RegExp.$1);
173 }
174
175 // 游戏系统
176 system.wii = ua.indexOf("Wii") > -1;
177 system.ps = /playstation/i.test(ua);
178
179 return {
180 engine: engine,
181 brower: brower,
182 system: system
183 };
184
185 }();

Windows操作系统下部分浏览器测试结果:

JavaScript:用户代理检测:通过浏览器识别平台、操作系统等(Windows, Mac, iOS,iPad等)的更多相关文章

  1. 用户代理检测与浏览器Ua详细分析

    用户代理检测与浏览器Ua详细分析:http://www.cnblogs.com/hykun/p/Ua.html

  2. 【javascript】—— JS判断浏览器类型、操作系统

    navigator.userAgent : userAgent 属性是一个只读的字符串,声明了浏览器用于 HTTP 请求的用户代理头的值. navigator.platform : platform ...

  3. linux, windows, mac, ios等平台GCC预编译宏判断

    写跨平台c/c++程序的时候,需要搞清各平台下面的预编译宏,区分各平台代码.而跨平台c/c++编程,GCC基本在各平台都可以使用.整理了一份各平台预编译宏的判断示例. 需要注意几点: * window ...

  4. JavaScript功能检测技术和函数构造

    Javascript与很多编程语言不同,它不能够控制其运行环境.再写php代码时,只要在服务器端部署了正确的版本,那么程序就绝对能够运行,对于其他python或ruby后端语言来说,也不存在什么灰色区 ...

  5. 【javascript】浏览器用户代理检测脚本实现

    以下是完整的用户代理字符串检测脚本,包括检测呈现引擎.平台.Windows操作系统.移动设备和游戏系统. var client = function(){ // 呈现引擎 var engine = { ...

  6. javascript——处理(获取)浏览器版本、操作系统

    javascript——处理(获取)浏览器版本.操作系统 /** * Created by Administrator on 15-1-12. */ function BroswerUtil() { ...

  7. Javascript高级编程学习笔记(34)—— 客户端检测(3)用户代理检测

    用户代理检测 前面的文章介绍的是如何检测浏览器对某一功能的支持情况 但是在实践中我们有些时候免不了需要知道用户到底是用的什么浏览器对我们的站点进行访问 这也是统计用户行为的一部分 用户代理检测这种方式 ...

  8. javascript关于检测浏览器和操作系统的问题

    1.方法学: 最好是检测浏览器的最小版本,这样才不会当版本升级之后不断添加新的内容进去. 理想的方式: if(isMinIE5){ //code } 直接检查准确的版本的缺点: if(isMinIE5 ...

  9. javascript检测当前浏览器是否为微信浏览器

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  10. 第一百四十节,JavaScript,封装库--浏览器检测

    JavaScript,封装库--浏览器检测 在函数库编写一个,浏览器检测对象 /** sys浏览器检测对象,对象下有两个属性,liu_lan_qi属性和xi_tong属性 * liu_lan_qi属性 ...

随机推荐

  1. CVPR 2023 | RCF:完全无监督的视频物体分割

    TLDR: 视频分割一直是重标注的一个task,这篇CVPR 2023文章研究了完全不需要标注的视频物体分割.仅使用ResNet,RCF模型在DAVIS16/STv2/FBMS59上提升了7/9/5% ...

  2. ARM Trusted Firmware——编译选项(二)

    @ 目录 1. 常用部分 2. 安全相关 2.1 签名 2.2 加密 2.3 哈希 2.4 中断 3.GICv3驱动程序选项 4. 调试选项 1. 常用部分 编译选项 解释 BL2 指定生成fip文件 ...

  3. 探究eFuse:硬件保障与系统安全的核心

    探究eFuse:硬件保障与系统安全的核心 图1: 编程熔断的 eFuse eFUSE的全名是"Electrically Programmable Read-Only Memory Fuse& ...

  4. 面霸的自我修养:JMM与锁的理论

    王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是<面霸的自我修养>的第二弹,内容是 Java 并发编程中关于 Java 内存模型(Ja ...

  5. Tibos.Devops项目介绍

    诞生背景 随着微服务的普及,更多的企业选择迁移到云,传统的部署方式已经无法满足需求,市面上devops产品也应运而生,结合自己使用的经验,也制作了一款同类产品,并开源出来,与大家一起探讨学习 前置条件 ...

  6. GGTalk 开源即时通讯系统源码剖析之:客户端全局缓存及本地存储

    继上篇<GGTalk 开源即时通讯系统源码剖析之:虚拟数据库>详细介绍了 GGTalk 内置的虚拟的数据库,无需部署真实数据库便能体验GGTalk的全部功能,虚拟数据库将极大地简化服务端的 ...

  7. 分享1-3年经验的Java面试

    最近的温度真是一路的飙升啊,出个门实属不易,但是还是有所收获滴,趁着今天不忙,赶紧给大家分享一波Java面经,对于想去BAT大公司的面试者来说,我这里可能不太合适,深度或许不够,但是对于刚毕业或者有1 ...

  8. ETL之apache hop系列2-hop web安装和入门

    前言 在Docker安装apache hop 首先确保Docker已经安装和运行Java 11 JDK 安装文档参考:https://blog.csdn.net/Chia_Hung_Yeh/artic ...

  9. Linux 内核音频子系统调试

    debugfs 文件系统 debugfs 可以为 Linux 内核各个模块的分析调试,提供许多信息,如音频子系统的 ASoC,以及 tracing 等.debugfs 文件系统可以通过命令行工具挂载, ...

  10. 作为一个客户经理你一个如何给客户介绍API接口

    随着科技的发展,API(Application Programming Interface,应用程序接口)的应用已经逐渐普及,而API接口作为现代企业实现智能化运营和管理的重要工具之一,也备受关注.作 ...