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

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

怪癖检测:实际上是浏览器现存的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. Day05_Java_作业

    A:看程序写结果(写出自己的分析理由),程序填空,改错,看程序写结果. 1.看程序写结果 class Demo { public static void main(String[] args) { i ...

  2. Linux下手工编译libiconv库的小问题

    我的电脑是 Ubuntu 14.04 LTS, 自己手工编译 php5.6, 打开 ZEND_EXTRA_LIBS='-liconv' 时, 发现没有安装 libiconv, 也就是编码转换的库, 所 ...

  3. OSS的使用(谷粒商城58-64)

    OSS的使用(谷粒商城58-64) 购买之类的就不在这里详述了,阿里云文档几乎都写了 创建bucket 学习阶段,相对独特的点在于我们需要选择公共读 项目开发阶段,不能选择公共读了,要尽量选择私有(代 ...

  4. 在langchain中使用带简短知识内容的prompt template

    简介 langchain中有个比较有意思的prompt template叫做FewShotPromptTemplate. 他是这句话的简写:"Prompt template that con ...

  5. 使用ClamAV进行linux病毒扫描

    前言 ClamAV是一个在命令行下查毒(并非杀毒)的软件,其免费开源跨平台.ClamAV默认只能查出服务器内的病毒,但是无法清除,最多删除. 安装ClamAV yum install -y epel- ...

  6. redis集群:MASTER aborted replication with an error: NOAUTH Authentication required.

    发现个问题:redis集群所在服务器,磁盘空间很快就被占满,使用 "du -sh *"查看每个文件夹的大小,发现redis集群三个从节点的日志文件占用空间很大. 下面记录问题排查及 ...

  7. 从零开始实现放置游戏(十七)——完结篇(附DEMO地址)

    大家好,时隔2年多,我来填坑啦! 之前用的技术.设计思路都不成熟,所以直接干掉重做了. 由于从头教学实在太啰嗦,精力也有限,咱们还是直接上源码吧. DEMO地址: http://212.129.154 ...

  8. [信息安全] 加密算法:md5摘要算法 / sha256算法

    1 MD5 1.1 算法定义 MD5的全称为 Message-Digest Algorithm,是一种被广泛使用的单向散列函数.属于Hash算法中一种比较重要算法--具有单项加密.加密结果唯一.安全性 ...

  9. iOS视图控件的内容显示和离屏渲染流程

    iOS中UI控件内容显示流程 UIKit界面组成 iOS中组成页面的各个元素基本来自UIKit,我们可以修改布局或自定义绘制来修改UIKit元素的默认展示. UIView的页面显示内容有CALayer ...

  10. 【matplotlib基础】--图例

    Matplotlib 中的图例是帮助观察者理解图像数据的重要工具.图例通常包含在图像中,用于解释不同的颜色.形状.标签和其他元素. 1. 主要参数 当不设置图例的参数时,默认的图例是这样的. impo ...