1 /**
  2  * 3.[Browser part]: Browser 资料分析包
  3  */
  4 Jx().$package(function(J){
  5     J.browserOptions = {
  6         adjustBehaviors: true,
  7         htmlClass: true
  8     };
  9     //J.query = J.string.mapQuery(window.location.search);
 10     J.host = window.location.host;
 11     
 12     // 设置 domain
 13     // document.domain = 'kdv.cn';
 14     
 15     
 16     var pf = navigator.platform.toLowerCase(),
 17         ua = navigator.userAgent.toLowerCase(),
 18         plug = navigator.plugins,
 19         
 20         platform,
 21         browser,
 22         engine,
 23 
 24         toFixedVersion,
 25         s;
 26     
 27     /**
 28      * @ignore
 29      * @param String ver
 30      * @param Number floatLength
 31      * @return Number 
 32      */
 33     toFixedVersion = function(ver, floatLength){
 34         ver= (""+ver).replace(/_/g,".");
 35         floatLength = floatLength || 1;
 36         ver = String(ver).split(".");
 37         ver = ver[0] + "." + (ver[1] || "0");
 38         ver = Number(ver).toFixed(floatLength);
 39         return ver;
 40     };
 41     
 42     /**
 43      * platform 名字空间
 44      * 
 45      * @namespace
 46      * @name platform
 47      * @type Object
 48      */
 49     platform = {
 50         getPlatform:function(){
 51             return pf;
 52         },
 53         
 54         /**
 55          * 操作系统的名称
 56          * 
 57          * @property name
 58          * @memberOf platform
 59          */
 60         name: (window.orientation != undefined) ? 'iPod' : (pf.match(/mac|win|linux/i) || ['unknown'])[0],
 61         
 62         version: 0,
 63         
 64         /**
 65          * 操作系统的版本号,如果是0表示不是此操作系统
 66          * iPod touch
 67          * Mozilla/5.0 (iPod; U; CPU iPhone OS 3_0 like Mac OS X; zh-cn) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16
 68          * 
 69          * @description {Num} 操作系统的版本号,如果是0表示不是此操作系统
 70          * @constant
 71          * @type Number
 72          */
 73         iPod: 0,
 74         
 75         /**
 76          * 操作系统的版本号,如果是0表示不是此操作系统
 77          * Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) version/4.0.4 Mobile/7B367 Safari/531.21.10
 78          * 
 79          * @description {Num} 操作系统的版本号,如果是0表示不是此操作系统
 80          * @constant
 81          * @type Number
 82          */
 83         iPad:0,
 84         
 85         /**
 86          * 操作系统的版本号,如果是0表示不是此操作系统
 87          * Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0_1 like Mac OS X; zh-cn) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A400 Safari/528.16
 88          * 
 89          * @description {Num} 操作系统的版本号,如果是0表示不是此操作系统
 90          * @constant
 91          * @type Number
 92          */
 93         iPhone:0,
 94         
 95         
 96         /**
 97          * 操作系统的版本号,如果是0表示不是此操作系统
 98          * Mozilla/5.0 (Linux; U; Android 2.0; en-us; Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17
 99          * 
100          * @description {Num} 操作系统的版本号,如果是0表示不是此操作系统
101          * @constant
102          * @type Number
103          */
104         android:0,
105         
106         
107         
108         /**
109          * 操作系统的版本号,如果是0表示不是此操作系统
110          * 
111          * 
112          * @description {Num} 操作系统的版本号,如果是0表示不是此操作系统
113          * @constant
114          * @type Number
115          */
116         win: 0,
117         
118         /**
119          * 操作系统的版本号,如果是0表示不是此操作系统
120          * 
121          * 
122          * @description {Num} 操作系统的版本号,如果是0表示不是此操作系统
123          * @constant
124          * @type Number
125          */
126         linux: 0,
127         
128         /**
129          * 操作系统的版本号,如果是0表示不是此操作系统
130          * 
131          * 
132          * @description {Num} 操作系统的版本号,如果是0表示不是此操作系统
133          * @constant
134          * @type Number
135          */
136         mac: 0,
137         
138         /**
139          * 设置浏览器类型和版本
140          * 
141          * @ignore
142          * @private
143          * @memberOf browser
144          * 
145          */
146         set: function(name, ver){
147             this.name = name;
148             this.version = ver;
149             this[name] = ver;
150         }
151     };
152     
153     platform[platform.name] = true;
154     
155     // 探测操作系统版本
156     (s = ua.match(/windows ([\d.]+)/)) ? platform.set("win",toFixedVersion(s[1])):
157     (s = ua.match(/windows nt ([\d.]+)/)) ? platform.set("win",toFixedVersion(s[1])):
158     (s = ua.match(/linux ([\d.]+)/)) ? platform.set("linux",toFixedVersion(s[1])) :
159     (s = ua.match(/mac ([\d.]+)/)) ? platform.set("mac",toFixedVersion(s[1])):
160     (s = ua.match(/ipod ([\d.]+)/)) ? platform.set("iPod",toFixedVersion(s[1])):
161     (s = ua.match(/ipad[\D]*os ([\d_]+)/)) ? platform.set("iPad",toFixedVersion(s[1])):
162     (s = ua.match(/iphone ([\d.]+)/)) ? platform.set("iPhone",toFixedVersion(s[1])):
163     (s = ua.match(/android ([\d.]+)/)) ? platform.set("android",toFixedVersion(s[1])) : 0;
164     
165     /**
166      * browser 名字空间
167      * 
168      * @namespace
169      * @name browser
170      */
171     browser = {
172         /**
173          * @namespace
174          * @name features
175          * @memberOf browser
176          */
177         features: 
178         /**
179          * @lends browser.features
180          */    
181         {
182             /**
183              * @property xpath
184              */
185             xpath: !!(document.evaluate),
186             
187             /**
188              * @property air
189              */
190             air: !!(window.runtime),
191             
192             /**
193              * @property query
194              */
195             query: !!(document.querySelector)
196         },
197         
198         /**
199          * 获取浏览器的插件信息
200          * 
201          */
202         getPlugins: function(){
203             return plug;
204         },
205         
206         /**
207          * @namespace
208          * @name plugins
209          * @memberOf browser
210          */
211         plugins: 
212         /**
213          * @lends browser.plugins
214          */    
215         {
216             flash: (function(){
217                 //var ver = "none";
218                 var ver = 0;
219                 if (plug && plug.length) {
220                     var flash = plug['Shockwave Flash'];
221                     if (flash && flash.description) {
222                         ver = toFixedVersion(flash.description.match(/\b(\d+)\.\d+\b/)[1], 1) || ver;
223                     }
224                 } else {
225                     var startVer = 13;
226                     while (startVer--) {
227                         try {
228                             new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + startVer);
229                             ver = toFixedVersion(startVer);
230                             break;
231                         } catch(e) {}
232                     }
233                 }
234                 
235                 return ver;
236             })()
237         },
238         
239         
240         
241         /**
242          * 获取浏览器的userAgent信息
243          * 
244          * @memberOf browser
245          */
246         getUserAgent: function(){
247             return ua;
248         },
249         
250         /**
251          * 用户使用的浏览器的名称,如:chrome
252          * 
253          * 
254          * @description {String} 用户使用的浏览器的名称,如:chrome
255          * @type Number
256          */
257         name: "unknown",
258         
259         /**
260          * 浏览器的版本
261          * @property version
262          * @memberOf browser
263          */
264         version: 0,
265         
266         /**
267          * 用户使用的浏览器的版本号,如果是0表示不是此浏览器
268          * 
269          * 
270          * @description {Number} 用户使用的浏览器的版本号,如果是0表示不是此浏览器
271          * @type Number
272          */
273         ie: 0,
274         
275         /**
276          * 用户使用的浏览器的版本号,如果是0表示不是此浏览器
277          * 
278          * 
279          * @description {Number} 用户使用的浏览器的版本号,如果是0表示不是此浏览器
280          * @type Number
281          */
282         firefox: 0,
283         
284         /**
285          * 用户使用的浏览器的版本号,如果是0表示不是此浏览器
286          * 
287          * 
288          * @description {Number} 用户使用的浏览器的版本号,如果是0表示不是此浏览器
289          * @type Number
290          */
291         chrome: 0,
292         
293         
294         /**
295          * 用户使用的浏览器的版本号,如果是0表示不是此浏览器
296          * 
297          * 
298          * @description {Number} 用户使用的浏览器的版本号,如果是0表示不是此浏览器
299          * @type Number
300          */
301         opera: 0,
302         
303         /**
304          * 用户使用的浏览器的版本号,如果是0表示不是此浏览器
305          * 
306          * 
307          * @description {Number} 用户使用的浏览器的版本号,如果是0表示不是此浏览器
308          * @type Number
309          */
310         safari: 0,
311         
312         /**
313          * 用户使用的浏览器的版本号,如果是0表示不是此浏览器
314          * 
315          * 
316          * @description {Number} 用户使用的浏览器的版本号,如果是0表示不是此浏览器
317          * @type Number
318          */
319         mobileSafari: 0,
320         
321         /**
322          * 用户使用的是否是adobe 的air内嵌浏览器
323          */
324         adobeAir: 0,
325         
326         /**
327          * 是否支持css3的borderimage
328          * 
329          * @description {boolean} 检测是否支持css3属性borderimage
330          */
331         //borderimage: false,
332         
333         /**
334          * 设置浏览器类型和版本
335          * 
336          * @ignore
337          * @private
338          * @memberOf browser
339          * 
340          */
341         set: function(name, ver){
342             this.name = name;
343             this.version = ver;
344             this[name] = ver;
345         }
346     };
347     
348     // 探测浏览器并存入 browser 对象
349     (s = ua.match(/msie ([\d.]+)/)) ? browser.set("ie",toFixedVersion(s[1])):
350     (s = ua.match(/firefox\/([\d.]+)/)) ? browser.set("firefox",toFixedVersion(s[1])) :
351     (s = ua.match(/chrome\/([\d.]+)/)) ? browser.set("chrome",toFixedVersion(s[1])) :
352     (s = ua.match(/opera.([\d.]+)/)) ? browser.set("opera",toFixedVersion(s[1])) :
353     (s = ua.match(/adobeair\/([\d.]+)/)) ? browser.set("adobeAir",toFixedVersion(s[1])) :
354     (s = ua.match(/version\/([\d.]+).*safari/)) ? browser.set("safari",toFixedVersion(s[1])) : 0;
355 
356     //mobile safari 判断,可与safari字段并存
357     (s = ua.match(/version\/([\d.]+).*mobile.*safari/)) ? browser.set("mobileSafari",toFixedVersion(s[1])) : 0;
358     if(platform.iPad) browser.set('mobileSafari', '0.0');
359     
360     //browser.set("borderimage",browser.firefox>3 || browser.safari || browser.chrome);
361     
362     if(browser.ie){
363         if(!document.documentMode) document.documentMode=Math.floor(browser.ie);
364         else if(document.documentMode!==Math.floor(browser.ie)) browser.set("ie",toFixedVersion(document.documentMode));
365     }
366     
367     //J.out(browser.name);
368     //J.out(browser.ua);
369     
370     //!!navigator.userAgent.match(/Apple.*Mobile.*Safari/);
371     
372     /**
373      * engine 名字空间
374      * 
375      * @namespace
376      * @name engine
377      * @memberOf browser
378      */
379     engine = {
380         /**
381          * 浏览器的引擎名字
382          * 
383          * @memberOf browser.engine
384          */
385         name: 'unknown',
386         
387         /**
388          * 浏览器的引擎版本
389          * 
390          * @memberOf browser.engine
391          */
392         version: 0,
393         
394         /**
395          * trident 引擎的版本,0表示非此引擎
396          * 
397          * @memberOf browser.engine
398          */
399         trident: 0,
400         
401         /**
402          * gecko 引擎的版本,0表示非此引擎
403          * 
404          * @memberOf browser.engine
405          * 
406          */
407         gecko: 0,
408         
409         /**
410          * webkit 引擎的版本,0表示非此引擎
411          * 
412          * @memberOf browser.engine
413          */
414         webkit: 0,
415         
416         /**
417          * presto 引擎的版本,0表示非此引擎
418          * 
419          * @memberOf browser.engine
420          * @property presto
421          */
422         presto: 0,
423         
424         /**
425          * 设置浏览器引擎的类型和版本
426          * @ignore
427          * @memberOf browser.engine
428          */
429         set: function(name, ver){
430             this.name = name;
431             this.version = ver;
432             this[name] = ver;
433         }
434         
435     };
436     
437     /*
438     // 探测浏览器的内核并存入 browser.engine 对象
439     (s = (!window.ActiveXObject) ? 0 : ((window.XMLHttpRequest) ? 5 : 4)) ? engine.set("trident", s):
440     (s = (document.getBoxObjectFor == undefined) ? 0 : ((document.getElementsByClassName) ? 19 : 18)) ? engine.set("gecko",s) :
441     (s = (navigator.taintEnabled) ? false : ((browser.features.xpath) ? ((browser.features.query) ? 525 : 420) : 419)) ? engine.set("webkit", s) :
442     (s = (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925))) ? engine.set("presto", s) : 0;
443     */
444     
445     // 探测浏览器的内核并存入 browser.engine 对象
446     
447     (s = ua.match(/trident\/([\d.]+)/)) ? engine.set("trident",toFixedVersion(s[1])):
448     (s = ua.match(/gecko\/([\d.]+)/)) ? engine.set("gecko",toFixedVersion(s[1])) :
449     (s = ua.match(/applewebkit\/([\d.]+)/)) ? engine.set("webkit",toFixedVersion(s[1])) :
450     (s = ua.match(/presto\/([\d.]+)/)) ? engine.set("presto",toFixedVersion(s[1])) : 0;
451     
452     if(browser.ie){
453         if(browser.ie == 6){
454             engine.set("trident", toFixedVersion("4"));
455         }else if(browser.ie == 7 || browser.ie == 8){
456             engine.set("trident", toFixedVersion("5"));
457         }
458     }
459     
460     
461     /**
462      * 调整浏览器行为
463      * 
464      * @ignore
465      */
466     var adjustBehaviors = function() {
467         // ie6 背景图片不能被缓存的问题
468         if (browser.ie && browser.ie < 7) {
469             try {
470                 document.execCommand('BackgroundImageCache', false, true);
471             }catch(e){
472                 //J.out("错误:[" + e.name + "] "+e.message+", " + e.fileName+", 行号:"+e.lineNumber+"; stack:"+typeof e.stack, 2);
473             }
474         }
475     }
476     
477     if(J.browserOptions.adjustBehaviors){
478          adjustBehaviors();
479     }
480     
481     var filterDot = function(string){
482         //return J.string.replaceAll(string, "\.", "_");
483         return String(string).replace(/\./gi,"_");
484     };
485     
486     // 给html标签添加不同浏览器的参数className
487     var addHtmlClassName = function() {
488         var htmlTag = document.documentElement;
489         var htmlClassName = [htmlTag.className];
490         htmlClassName.push('javascriptEnabled');
491         htmlClassName.push(platform.name);
492         htmlClassName.push(platform.name + filterDot(platform.version));
493         htmlClassName.push(browser.name);
494         htmlClassName.push(browser.name + filterDot(browser.version));
495         if(document.documentMode){
496             htmlClassName.push('documentMode_' + document.documentMode);
497         }
498         htmlClassName.push(engine.name);
499         htmlClassName.push(engine.name + filterDot(engine.version));
500         
501         if(browser.plugins.flash){
502             htmlClassName.push("flash");
503             htmlClassName.push("flash" + filterDot(browser.plugins.flash));
504         }
505         if(typeof(window['webTop']) != 'undefined' && window['webTop']) {
506              htmlClassName.push("webTop");
507         }
508         htmlTag.className = htmlClassName.join(' ');
509        
510     }
511 
512     
513     if(J.browserOptions.htmlClass){
514         addHtmlClassName();
515     }
516     
517     J.platform = platform;
518     J.browser = browser;
519     J.browser.engine = engine;
520 });
521