├── README.md
├── index.html
└── client.js
/README.md:
--------------------------------------------------------------------------------
1 | UserAgent
2 | =========
3 |
4 | 测试一个浏览器内核版本,浏览器版本以及所用系统
5 |
6 | 主要是参考了《javascript高级程序设计》里面的一章,然后可能是因为时间比较久了,现在的一些新的不支持,所以添加了比如新的支持,主要就是做了写正则匹配的事,主要有如下一些
7 |
8 | 1. Windows Phone(7.5 和 8.0)
9 | 2. 火狐浏览器在安卓手机端的支持
10 | 3. IE11的支持
11 | 4. Opera浏览器在Opera 15之后放弃自家的浏览内核Prestro引擎,奔向了WebKit之后的一点识别问题
12 | 5. 添加了对win8 和win8.1的支持
13 |
14 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | User-agent Detection Example
5 |
6 |
7 |
8 |
9 |
10 |
11 | Rendering Engines
12 |
13 | - client.engine.ie =
14 | - client.engine.webkit =
15 | - client.engine.gecko =
16 | - client.engine.khtml =
17 | - client.engine.opera =
18 | - client.engine.type = : 
19 |
20 |
21 |
22 |
23 | Browsers
24 |
25 | - client.browser.ie =
26 | - client.browser.safari =
27 | - client.browser.firefox =
28 | - client.browser.konq =
29 | - client.browser.opera =
30 | - client.browser.chrome =
31 | - client.browser.type = : 
32 |
33 |
34 |
35 |
36 | System
37 |
38 | - client.system.win =
39 | - client.system.mac =
40 | - client.system.x11 =
41 | - client.system.iphone =
42 | - client.system.ipod =
43 | - client.system.ipad =
44 | - client.system.ios =
45 | - client.system.android =
46 | - client.system.nokiaN =
47 | - client.system.winMobile =
48 | - client.system.wii =
49 | - client.system.ps =
50 | - client.system.winPhone =
51 | - client.system.type =
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/client.js:
--------------------------------------------------------------------------------
1 |
2 | var client = function(){
3 |
4 | //rendering engines
5 | var engine = {
6 | ie: 0,
7 | gecko: 0,
8 | webkit: 0,
9 | khtml: 0,
10 | opera: 0,
11 | type : null,
12 | //complete version
13 | ver: null
14 | };
15 |
16 | //browsers
17 | var browser = {
18 | //browsers
19 | ie: 0,
20 | firefox: 0,
21 | safari: 0,
22 | konq: 0,
23 | opera: 0,
24 | chrome: 0,
25 | type:null,
26 | //specific version
27 | ver: null
28 | };
29 |
30 |
31 | //platform/device/OS
32 | var system = {
33 | win: false,
34 | mac: false,
35 | x11: false,
36 |
37 | winPhone : false,
38 | winMobile: false,
39 | iphone: false,
40 | ipod: false,
41 | ipad: false,
42 | ios: false,
43 | android: false,
44 | nokiaN: false,
45 | type: null
46 | };
47 |
48 | //detect rendering engines/browsers
49 | var ua = navigator.userAgent;
50 | //opera
51 | if (window.opera){
52 | engine.opera = browser.opera =window.opera.version();
53 | browser.type = "opera";
54 | engine.type = "opera";
55 | } else if (/AppleWebKit\/(\S+)/.test(ua)){
56 | engine.type = "webkit" ;
57 | engine.webkit = RegExp["$1"];
58 |
59 | //figure out if it's Chrome or Safari
60 | if(/OPR\/(\S+)/.test(ua)){//首先排除opera。由于在新版本中使用了webkit内核
61 | browser.type = "opera";
62 | browser.opera = RegExp["$1"];
63 | }else if (/Chrome\/(\S+)/.test(ua)){
64 | browser.type = "chrome";
65 | browser.chrome = RegExp["$1"];
66 | } else if (/Version\/(\S+)/.test(ua)){
67 | browser.type = "safari";
68 | browser.safari = RegExp["$1"];
69 | } else {
70 | //approximate version
71 | var safariVersion = 1;
72 | if (engine.webkit < 100){
73 | safariVersion = 1;
74 | } else if (engine.webkit < 312){
75 | safariVersion = 1.2;
76 | } else if (engine.webkit < 412){
77 | safariVersion = 1.3;
78 | } else {
79 | safariVersion = 2;
80 | }
81 | browser.type = "safari";
82 | browser.safari = safariVersion;
83 | }
84 | } else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){
85 | engine.type = "khtml";
86 | engine.khtml = browser.konq = RegExp["$1"];
87 | } else if (/rv:([^\)]+)\) Gecko\/(\d{8}|\S+)/.test(ua)){// 添加了手机火狐不是8位数字的支持
88 | engine.type = "gecko";
89 | engine.gecko = RegExp["$1"];
90 |
91 | //determine if it's Firefox
92 | if (/Firefox\/(\S+)/.test(ua)){
93 | browser.type = "firefox";
94 | browser.firefox = RegExp["$1"];
95 | }
96 | } else if (/MSIE ([^;]+)/.test(ua)){
97 | //engine.ver = browser.ver = RegExp["$1"]; browser.ver =
98 | engine.type = browser.type = "ie";
99 | engine.ie = browser.ie = RegExp["$1"];
100 | } else if( /Trident\/([^;]+)/.test(ua) ){//ie11
101 | if(/rv:([^\)]+)\)/.test(ua)){
102 | engine.type = browser.type = "ie";
103 | engine.ie = browser.ie = RegExp["$1"];
104 | }
105 | }
106 |
107 | //detect platform
108 | var p = navigator.platform;
109 | if(system.win = p.indexOf("Win") == 0){
110 | system.type = "win";
111 | //detect windows operating systems
112 | if (/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)){
113 | if (RegExp["$1"] == "NT"){
114 | switch(RegExp["$2"]){
115 | case "5.0":
116 | system.win = "2000";
117 | break;
118 | case "5.1":
119 | system.win = "XP";
120 | break;
121 | case "6.0":
122 | system.win = "Vista";
123 | break;
124 | case "6.1":
125 | system.win = "7";
126 | break;
127 | case "6.2":
128 | system.win = "8";
129 | break;
130 | case "6.3":
131 | system.win = "8.1";
132 | break;
133 | default:
134 | system.win = "NT";
135 | break;
136 | }
137 | } else if (RegExp["$1"] == "9x"){
138 | system.win = "ME";
139 | } else if (RegExp["$1"] == "Ph"){//windows phone 7.5 and 8.0
140 | system.type = "winPhone";
141 | if(/Windows Phone OS (\d+.\d+)/.test(ua) || /Windows Phone (\d+.\d+)/.test(ua)){
142 | system.winPhone = RegExp["$1"] ;
143 | }
144 | }else {
145 | system.win = RegExp["$1"];
146 | }
147 | }
148 |
149 | //windows mobile
150 | if (system.win == "CE"){
151 | system.winMobile = system.win;
152 | } else if (system.win == "Ph"){
153 | if(/Windows Phone OS (\d+.\d+)/.test(ua)){;
154 | system.type = "winMobile";
155 | system.winMobile = RegExp["$1"];
156 | }
157 | }
158 | }else if(system.x11 = (p == "X11") || (p.indexOf("Linux") == 0)){
159 | system.type = "x11";
160 | //determine Android version
161 | if (/Android (\d+\.\d+)/.test(ua)){
162 | system.type = "android";
163 | system.android = RegExp.$1;
164 | }
165 | }else if( system.mac = p.indexOf("Mac") == 0){
166 | system.type = "mac";
167 | //mobile devices
168 | if(system.iphone = ua.indexOf("iPhone") > -1) {
169 | system.type = "iphone";
170 | }else if(system.ipod = ua.indexOf("iPod") > -1){
171 | system.type = "ipod";
172 | }else if(system.ipad = ua.indexOf("iPad") > -1){
173 | system.type = "ipad";
174 | }
175 |
176 | //determine iOS version
177 | if (system.mac && ua.indexOf("Mobile") > -1){
178 | if (/CPU (?:iPhone )?OS (\d+_\d+)/.test(ua)){
179 | system.ios = parseFloat(RegExp.$1.replace("_", "."));
180 | } else {
181 | system.ios = 2; //can't really detect - so guess
182 | }
183 | }
184 | }
185 |
186 | //处理一些特别的情况
187 | if(system.nokiaN = ua.indexOf("NokiaN") > -1){
188 | system.type = "nokiaN" ;
189 | }else if(/Android; Mobile/.test(ua)){//安卓上火狐浏览器
190 | system.type = "android";
191 | system.android = "Not detect" ;
192 | }
193 |
194 |
195 | //return it
196 | return {
197 | engine: engine,
198 | browser: browser,
199 | system: system
200 | };
201 |
202 | }();
203 |
--------------------------------------------------------------------------------