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