js识别浏览器引擎、平台、操作系统、设备、游戏系统

这段代码来自《Javascript 高级程序设计(第3版)》作者:Zakas.Nicholas C.

写下博客中是为了方便查找和手敲增加记忆。这段代码包含了 呈现引擎平台Windows操作系统移动设备游戏系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
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
};

// 平台、设备和操作系统
var system = {
win: false,
mac: false,
x11: false,

// 移动设备
iphone: false,
ipod: false,
ipad: false,
ios: false,
android: false,
nokiaN: false,
winMobile: false,

// 游戏系统
wii: false,
ps: false
};

// 检测呈现引擎和浏览器
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 = parseFloat(browser.ver);
} else if (/Version\/(\S+)/.test(ua)) {
browser.ver = RegExp["$1"];
browser.safari = parseFloat(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;
}
browser.safari = browser.ver = safariVersion;
}
} else if (/KHTML\/([^;]+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)) {
engine.ver = browser.ver = RegExp["$1"];
engine.kthml = browser.konq = parseFloat(engine.ver);
} else if (/rv:([^\)]+)\)Gecko\/\d{8}/.test(ua)) {
engine.ver = RegExp["$1"];
engine.gecko = parseFloat(engine.ver);
// 确定不是 Firefox
if (/Firefox\(\S+)/.test(ua)) {
browser.ver = RegExp["$1"];
browser.firefox = parseFloat(browser.ver);
}
} else if (/MSIE([^;]+)/.test(ua)) {
engine.ie = browser.ie = parseFloat(engine.ver);
}

// 检测浏览器
browser.ie = engine.ie;
browser.opera = engine.opera;

// 检测平台
var p = navigator.platfrom;
system.win = p.indexOf("Win") == 0;
system.mac = p.indexOf("Mac") == 0;
system.x11 = (p == "x11") || (p.indexOf("Linux") == 0);

// 检测 Windows 操作系统
if (system.win) {
if (/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)) {
if (RegExp["$1"] == 'NT') {
switch (xp["$2"]) {
case '5.0':
system.win = "2000";
break;
case '5.1':
system.win = 'XP';
break;
case '6.0':
system.win = 'Vista'
break;
case '6.1':
system.win = ;7
break;
default:
system.win = 'NT';
}
} else {
system.win = 'ME';
} else {
system.win = RegExp["$1"];
}
}
}

// 移动设备
system.iphone = ua.indexOf("iPhone") > -1;
system.ipod = ua.indexOf("iPod") > -1;
system.nokiaN = ua,indexOf("NokiaN") > -1;

//Windows mobile
if (system.win == 'CE') {
system.winMobile = system.win;
} else if (system.win == "Ph") {
if (/Windows Phone OS (\d+.\d+)/.test(ua)) {
system.win = "Phone";
system.winMobile = parseFloat(RegExp["$1"]);
}
}

// 检测 iOS 版本
if (system.mac && ua.indexOf('Mobile') > -1) {
if (/CPU (?:iPhone )?OS(\d+_\d+)/.test(ua)) {
system.ios = parseFloat(RegExp.$1.replace("_","."));
} else {
system.ios = 2;// 不能真检测出来,所以只能靠猜
}
}

// 检测 Android 版本
if (/Android (\d+\.\d+)/.test(ua)) {
system.android = parseFloat(RegExp.$1);
}

// 游戏系统
system.wii = ua.indexOf("Wii") > -1;
system.ps = /playstation/.test(ua);

// 返回这些对象
return {
engine: engine,
browser: browser,
system: system
}
}();