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

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

怪癖检测:实际上是浏览器现存的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. 2.融合进阶:Stacking与Blending

    1 堆叠法Stacking 1.1 堆叠法的基本思想 堆叠法Stacking是近年来模型融合领域最为热门的方法,它不仅是竞赛冠军队最常采用的融合方法之一,也是工业中实际落地人工智能时会考虑的方案之一. ...

  2. PHP echo 和 print 语句

    在 PHP 中,有两种基本的输出方法:echo 和 print. PHP echo 和 print 语句 echo 和 print 之间的差异: echo - 能够输出一个以上的字符串 print - ...

  3. PostgreSQL 9.6 文档: 数据类型

    章 8. 数据类型 目录 8.1. 数字类型 8.1.1. 整数类型 8.1.2. 任意精度数字 8.1.3. 浮点类型 8.1.4. 序数类型 8.2. 货币类型 8.3. 字符类型 8.4. 二进 ...

  4. vs(visual stuiod)中vc++工程的Filter和Folder及vcxproj知识

    vs中创建Filter 在一个新项目中右键 - Add - New,默认只有一选项 New Filter. 创建出来的Filter可以理解为是VS的过滤器(虚拟目录),它不会在本地的磁盘上新建目录,而 ...

  5. 【LaTeX】语法(更新中)

    目录 长度 空行 空格 超链接 数学公式 段落中(隐式) 单独成段(显式) 居中,左对齐,右对齐 居中 左对齐 右对齐 参考文献配置 TODO 参考资料 中文支持参考环境配置中的 内容,在这里不做重复 ...

  6. [Qt开发探幽(二)]浅谈关于元对象,宏和Q_ENUM

    目录 [Qt开发探幽(二)]浅谈关于元对象,宏和Q_ENUM 前言 一.元对象 但是 二.关于Q_OBJECT等宏属性 1.元对象系统 2.信号与槽 3.属性系统 三.关于Q_ENUMS 1.将其注册 ...

  7. Web服务器部署上线的踩坑流程回顾与知新

    5月份时曾部署上线了C++的Web服务器,温故而知新,本篇文章梳理总结一下部署流程知识: 最初的解决方案:https://blog.csdn.net/BinBinCome/article/detail ...

  8. 想让你的工作轻松高效吗?揭秘Java + React导出Excel/PDF的绝妙技巧!

    前言 在B/S架构中,服务端导出是一种高效的方式.它将导出的逻辑放在服务端,前端仅需发起请求即可.通过在服务端完成导出后,前端再下载文件完成整个导出过程.服务端导出具有许多优点,如数据安全.适用于大规 ...

  9. SQL简单使用指南

    SQL简单使用指南 SQL(结构化查询语言)是一种用于管理和操作关系型数据库的标准化语言. 数据库概述 数据库是用于存储和组织数据的结构.它由表(表格)组成,每个表都包含多个列和行.以下是SQL中最常 ...

  10. 《Python魔法大冒险》 001 序章:少年小鱼的不平凡一天

    在一个普通的城市里,生活着一个名叫小鱼的少年.他是一名初中生,但在班级里,他的学习成绩总是垫底.同学们经常取笑他,有时甚至戏称他为"倒数王". 放学后,小鱼一个人走在回家的路上,他 ...