2 // ------------------------------------------------------------------------- //
\r
3 // ------------ local variables -------------------------------------------- //
\r
4 // ------------------------------------------------------------------------- //
\r
7 * UserAgent に関する定数を保持する。
\r
12 var X_UA = X[ 'UA' ] = {},
\r
13 X_UA_classNameForHTML = 'js-enabled ';
\r
16 var dua = navigator.userAgent,
\r
17 dav = navigator.appVersion,
\r
18 tv = parseFloat(dav),
\r
19 sys = navigator.platform,
\r
20 tridentToVer, i, j, v;
\r
22 console.log( ' userAgent : ' + dua );
\r
24 console.log( ' appVersion : ' + dav );
\r
26 console.log( ' platform : ' + sys );
\r
29 // TODO 3DS, DSi, WiiU
\r
31 if( sys.indexOf( 'iP' ) === 0 ){
\r
33 v = dua.split( 'OS ' )[ 1 ].split( '_' );
\r
34 i = window.devicePixelRatio === 1;
\r
36 * @alias X.UA.iOSMajor
\r
39 X_UA[ 'iOSMajor' ] = parseFloat( v[ 0 ] ) || 0;
\r
41 * @alias X.UA.iOSMinor
\r
44 X_UA[ 'iOSMinor' ] = parseFloat( v[ 1 ] ) || 0;
\r
46 * @alias X.UA.iOSPatch
\r
49 X_UA[ 'iOSPatch' ] = parseFloat( v[ 2 ] ) || 0;
\r
54 X_UA[ 'iOS' ] = X_UA[ 'iOSMajor' ] + X_UA[ 'iOSMinor' ] / 10;
\r
56 if( screen.width === screen.height * 1.5 || screen.width * 1.5 === screen.height ){
\r
57 v = true; // 4:3 model
\r
60 if( sys === 'iPhone' ){
\r
62 * @alias X.UA.iPhone
\r
65 X_UA[ 'iPhone' ] = true;
\r
69 * @alias X.UA.iPhone_4s
\r
72 X_UA[ 'iPhone_4s' ] = true;
\r
77 * @alias X.UA.iPhone_3GS
\r
80 X_UA[ 'iPhone_3GS' ] = true;
\r
84 //alert( 'iPhone ' + ( X_UA[ 'iPhone_3GS' ] ? '3GS以下' : X_UA[ 'iPhone_4s' ] ? '4s以下' : '5以上' ) );
\r
86 if( sys === 'iPad' ){
\r
91 X_UA[ 'iPad' ] = true;
\r
94 * iPad2以下または初代iPad mini 以下
\r
95 * @alias X.UA.iPad_2Mini1
\r
98 X_UA[ 'iPad_2Mini1' ] = true;
\r
101 if( sys === 'iPod' ){
\r
106 X_UA[ 'iPod' ] = true;
\r
111 * @alias X.UA.iPod_4
\r
114 X_UA[ 'iPod_4' ] = true;
\r
119 * @alias X.UA.iPod_3
\r
122 X_UA[ 'iPod_3' ] = true;
\r
125 //alert( 'iPod touch ' + ( X_UA[ 'iPod_3' ] ? '3以下' : X_UA[ 'iPod_4' ] ? '4以下' : '5以上' ) );
\r
128 console.log( '>> iOS : ' + X_UA[ 'iOS' ] );
\r
130 if( dua.indexOf( 'hp-tablet' ) !== -1 || dua.indexOf( 'webOS' ) !== -1 ){
\r
132 * http://user-agent-string.info/list-of-ua/os-detail?os=webOS
\r
133 * @alias X.UA.webOS
\r
136 X_UA[ 'webOS' ] = true; // webOS
\r
138 if( sys.indexOf( 'Win' ) + 1 ){
\r
143 * @alias X.UA.WinCE
\r
146 X_UA[ sys ] = true;
\r
152 * @alias X.UA.Win16
\r
153 * @alias X.UA.Win32
\r
154 * @alias X.UA.Win64
\r
157 X_UA[ sys ] = true;
\r
159 if( v = dav.split( 'Windows NT 10' )[ 1 ] ){
\r
160 switch( v.substr( 0, 2 ) ){
\r
161 case '.0' : v = 10; break;
\r
165 if( v = dav.split( 'Windows NT ' )[ 1 ] ){
\r
166 switch( v.substr( 0, 3 ) ){
\r
167 case '6.3' : v = 8.1; break;
\r
168 case '6.2' : v = 8; break;
\r
169 case '6.1' : v = 7; break;
\r
170 case '6.0' : v = 'Vista'; break;
\r
171 case '5.2' : v = '2003|XP64'; break;
\r
172 case '5.1' : v = v.indexOf( '5.1; SV1' ) ? 'XP' : 'XPSP2'; break;
\r
173 case '5.0' : v = v.indexOf( '5.01' ) ? 2000 : '2kSP1'; break;
\r
174 case '4.0' : v = 'NT'; break;
\r
178 if( v = dav.split( 'Windows ' )[ 1 ] ){
\r
179 switch( v.substr( 0, 2 ) ){
\r
180 case '98' : v = v.indexOf( '98; Win 9x 4.90' ) ? '98|98SE' : 'ME'; break;
\r
181 case '95' : v = 95; break;
\r
182 case '3.' : v = parseFloat( v ); break;
\r
190 * 10, 8.1, 8, 7, Vista, 2003|XP64, XPSP2, XP, 2kSP1, 2000, ME, 98|98SE, 95, ?
\r
191 * @alias X.UA.Windows
\r
192 * @type {number|string}
\r
194 X_UA[ 'Windows' ] = v;
\r
200 if( sys.indexOf( 'Mac' ) + 1 ){
\r
201 console.log( 'Mac' );
\r
206 X_UA[ 'Mac' ] = true;
\r
208 case 'MacPowerPC' :
\r
210 * @alias X.UA.MacPPC
\r
213 X_UA[ 'MacPPC' ] = true;
\r
219 * @alias X.UA.MacPPC
\r
220 * @alias X.UA.Mac68K
\r
221 * @alias X.UA.MacIntel
\r
224 X_UA[ sys ] = true;
\r
227 if( ( sys.indexOf( 'Linux' ) + 1 ) || ( sys.indexOf( 'Android' ) + 1 ) ){
\r
228 console.log( 'Linux' );
\r
230 * @alias X.UA.Linux
\r
233 X_UA[ 'Linux' ] = true;
\r
235 if( v = dua.split( 'Android ' )[ 1 ] ){
\r
236 v = v.split( '.' );
\r
238 * @alias X.UA.AndroidMajor
\r
241 X_UA[ 'AndroidMajor' ] = parseFloat( v[ 0 ] ) || 0;
\r
243 * @alias X.UA.AndroidMinor
\r
246 X_UA[ 'AndroidMinor' ] = parseFloat( v[ 1 ] ) || 0;
\r
248 * @alias X.UA.AndroidPatch
\r
251 X_UA[ 'AndroidPatch' ] = parseFloat( v[ 2 ] ) || 0;
\r
253 * Firefox で Version が取れない!
\r
254 * http://bizmakoto.jp/bizid/articles/1207/31/news004.html
\r
255 * Chrome Android 4.0以上 Google
\r
256 * Dolphin Browser HD Android 2.0.1以上 Mobotap
\r
257 * Firefox Android 2.2以上 Mozilla
\r
258 * Opera Mobile Android 1.6以上 Opera Software ASA
\r
259 * Sleipnir Mobile Android 2.1以上 Fenrir
\r
260 * @alias X.UA.Android
\r
263 X_UA[ 'Android' ] = X_UA[ 'AndroidMajor' ] + X_UA[ 'AndroidMinor' ] / 10;
\r
264 console.log( '>> Android : ' + X_UA[ 'Android' ] );
\r
268 if( window.opera ){
\r
269 i = dua.split( 'Opera' )[ 1 ]; // Opera/
\r
270 j = dua.split( 'Version/' )[ 1 ];
\r
272 * @alias X.UA.Opera
\r
275 X_UA[ 'Opera' ] = v = Math.max( parseFloat( i ) || 0, parseFloat( j ) || 0, tv );
\r
277 * memo:closure compiler で minify するとOpera7で動かない
\r
278 * --compilation_level WHITESPACE_ONLY --formatting pretty_print <- 動く
\r
279 * @alias X.UA.Opera7
\r
282 X_UA[ 'Opera7' ] = v < 8;
\r
284 * @alias X.UA.Opera78
\r
287 X_UA[ 'Opera78' ] = v < 9;
\r
289 if( 0 < dua.indexOf( 'Opera Mini' ) )
\r
291 * @alias X.UA.OperaMini
\r
294 X_UA[ 'OperaMini' ] = true;
\r
296 if( 0 < dua.indexOf( 'Opera Mobi' ) )
\r
298 * @alias X.UA.OperaMobile
\r
301 X_UA[ 'OperaMobile' ] = true;
\r
303 if( 0 < dua.indexOf('Opera Tablet') )
\r
305 * @alias X.UA.OperaTablet
\r
308 X_UA[ 'OperaTablet' ] = true;
\r
310 if( 0 < dua.indexOf( 'Nintendo Wii' ) )
\r
315 X_UA[ 'Wii' ] = true;
\r
317 if( 0 < dua.indexOf( 'Nitro' ) )
\r
322 X_UA[ 'NDS' ] = true;
\r
324 console.log( '>> Opera : ' + v );
\r
326 if( v = parseFloat( dav.split( 'Edge/' )[ 1 ] ) ){
\r
332 X_UA[ 'Edge' ] = v;
\r
334 if( dav.indexOf( 'Mobile' ) ){
\r
336 * Microsoft Edge for Windows 10 Mobile
\r
337 * @alias X.UA.EdgeMobile
\r
340 X_UA[ 'EdgeMobile' ] = v;
\r
344 // Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
\r
345 if( ( v = dav.split( 'Trident/' )[ 1 ] ) || document.all ){ // .all は Opera にもいるので Opera の判定が先
\r
346 if( v = parseFloat( v ) )
\r
348 * IE11 の互換モードの navigator.appVersion にも Trident/7.0 が書かれているため互換モードか?判定ができるc
\r
349 * @alias X.UA.Trident
\r
352 X_UA[ 'Trident' ] = v;
\r
354 if( window[ 'ActiveXObject' ] )
\r
356 * @alias X.UA.ActiveX
\r
359 X_UA[ 'ActiveX' ] = true;
\r
361 v = parseFloat( dua.split( 'MSIE ' )[ 1 ] ) ||
\r
362 parseFloat( dua.split( 'rv:' )[ 1 ] ) || 0;
\r
364 tridentToVer = X_UA[ 'Trident' ] ? ( X_UA[ 'Trident' ] + 4 | 0 ) : v;
\r
366 if( tridentToVer !== v ){
\r
368 * IE10 以上の互換モードを使用している場合、そのバージョン
\r
369 * @alias X.UA.IEHost
\r
372 X_UA[ 'IEHost' ] = tridentToVer;
\r
375 * documentモードを考慮したIEのバージョン
\r
379 X_UA[ 'IE' ] = v = document.documentMode || tridentToVer;
\r
386 X_UA[ 'IE4' ] = true;
\r
393 X_UA[ 'IE45' ] = true;
\r
400 X_UA[ 'IE5' ] = true;
\r
407 X_UA[ 'IE55' ] = true;
\r
414 X_UA[ 'IE6' ] = true;
\r
421 X_UA[ 'IE7' ] = true;
\r
428 X_UA[ 'IE8' ] = true;
\r
435 X_UA[ 'IE9' ] = true;
\r
438 if( X_UA[ 'IE4' ] || X_UA[ 'IE45' ] ){
\r
443 X_UA[ 'IE4x' ] = true;
\r
446 if( X_UA[ 'IE5' ] || X_UA[ 'IE55' ] ){
\r
451 X_UA[ 'IE5x' ] = true;
\r
454 if( X_UA[ 'Mac' ] ){
\r
456 * @alias X.UA.MacIE
\r
459 X_UA[ 'MacIE' ] = true;
\r
462 if( 0 < dua.toLowerCase().indexOf( 'iemobile' ) || X_UA[ 'WinCE' ] ){
\r
464 * @alias X.UA.IEMobile
\r
467 X_UA[ 'IEMobile' ] = true;
\r
470 if( 0 < dua.toLowerCase().indexOf( 'windows phone' ) || 0 < dav.indexOf( 'ZuneWP' ) ){
\r
472 * @alias X.UA.WinPhone
\r
475 X_UA[ 'WinPhone' ] = true; // ZuneWP はデスクトップモードで登場する
\r
478 console.log( '>> IE : ' + v + ' ActiveX : ' + X_UA[ 'ActiveX' ] + ' IEHost : ' + X_UA[ 'IEHost' ] );
\r
479 // TODO XBox360, XBox1, Modern or Desktop, Standalone
\r
483 if( v = dua.split( 'NetFront\/' )[ 1 ] ){
\r
485 * http://qa.support.sony.jp/solution/S0812181056444/common/nfb34_dom_200jp/dom_dom0_JP.html
\r
486 * @alias X.UA.NetFront
\r
489 X_UA[ 'NetFront' ] = parseFloat( v ) || 0.1;
\r
490 console.log( '>> NetFront : ' + X_UA[ 'NetFront' ] );
\r
493 if( X_UA[ 'Linux' ] && tv === 2 && dua.indexOf( 'Sony\/COM2\/' ) !== -1 ){
\r
494 X_UA[ 'NetFront' ] = 3.4;
\r
495 console.log( '>> NetFront : ' + X_UA[ 'NetFront' ] );
\r
498 if( v = dua.toUpperCase().split( 'PLAYSTATION 3' )[ 1 ] ){
\r
500 * PlayStation 3 システムバージョン 4.10 未満の SONY 独自ブラウザ
\r
501 * http://www.useragentstring.com/pages/Playstation%203/
\r
502 * Mozilla/5.0 (PLAYSTATION 3; 3.55)
\r
503 * Mozilla/4.0 (PS3 (PlayStation 3); 1.00)
\r
504 * https://github.com/Famous/famous/blob/1a02c8084587d80519ea4bd3b55649ab32ee2e65/examples/assets/lib/require.js
\r
505 * PS3 ブラウザのロードイベントについて
\r
509 X_UA[ 'PS3' ] = parseFloat( v ) || 0.1;
\r
510 console.log( '>> PS3 : ' + X_UA[ 'PS3' ] );
\r
513 if( v = dua.split( 'iCab' )[ 1 ] ){
\r
515 * http://www.useragentstring.com/pages/iCab/
\r
516 * iCab/3.0.2 (Macintosh; U; PPC Mac OS X)
\r
517 * Mozilla/5.0 (Macintosh; U; PPC Mac OS; en) iCab 3
\r
521 X_UA[ 'iCab' ] = parseFloat( v ) || 0.1;
\r
522 console.log( '>> iCab : ' + X_UA[ 'iCab' ] );
\r
525 if( 0 < dua.indexOf( 'Gecko\/' ) && ( v = dua.split( 'rv:' )[ 1 ] ) ){
\r
526 v = v.split( '.' );
\r
528 * メジャーバージョン + マイナーバージョン
\r
529 * @alias X.UA.Gecko
\r
532 X_UA[ 'Gecko' ] = parseFloat( v[ 0 ] ) || 0 +
\r
533 ( parseFloat( v[ 1 ] ) || 0 ) / 10;
\r
535 * @alias X.UA.GeckoMajor
\r
538 X_UA[ 'GeckoMajor' ] = parseFloat( v[ 0 ] ) || 0;
\r
540 * @alias X.UA.GeckoMinor
\r
543 X_UA[ 'GeckoMinor' ] = parseFloat( v[ 1 ] ) || 0;
\r
545 * @alias X.UA.GeckoPatch
\r
548 X_UA[ 'GeckoPatch' ] = parseFloat( v[ 2 ] ) || 0;
\r
551 // https://developer.mozilla.org/ja/docs/Gecko_user_agent_string_reference
\r
552 // バージョン 41 以降の Android 版 Firefox では platform トークンに Android バージョンが含まれます。
\r
553 // 相互運用性向上のため、Android 4 以前のバージョンでブラウザが動作している場合は 4.4 と出力します。
\r
554 // Android バージョン 4 以降では実際のバージョン番号が出力されます。
\r
555 // なお、Gecko エンジンはすべての Android バージョンに対して同じ機能を提供しています。
\r
556 if( dua.indexOf( 'Android 4.4; Mobile;' ) !== -1 || dua.indexOf( 'Android 4.4; Tablet;' ) !== -1 ){
\r
557 X_UA[ 'Android' ] = '2.3+';
\r
559 if( dua.indexOf( 'Android;' ) !== -1 ){
\r
560 X_UA[ 'Android' ] = '2.2+';
\r
563 // TODO PC版 Fennec もある
\r
565 if( v = dua.split( 'Fennec/' )[ 1 ] ){
\r
567 * Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0
\r
568 * @alias X.UA.Fennec
\r
571 X_UA[ 'Fennec' ] = parseFloat( v );
\r
572 console.log( '>> Fennec : ' + X_UA[ 'Fennec' ] + ', Gecko : ' + X_UA[ 'Gecko' ] );
\r
574 if( X_UA[ 'Android' ] ){
\r
575 X_UA[ 'Fennec' ] = X_UA[ 'Gecko' ];
\r
580 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4.1) Gecko/20020508 Netscape6/6.2.3
\r
581 if( ( i = dua.indexOf( 'Netscape6/' ) ) !== -1 ){
\r
586 X_UA[ 'NN' ] = parseFloat( dua.substr( i + 10 ) ) || 6;
\r
591 X_UA[ 'NN6' ] = true;
\r
592 console.log( '>> NN : ' + X_UA[ 'NN' ] + ', Gecko : ' + X_UA[ 'Gecko' ] );
\r
594 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax)
\r
595 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3
\r
596 if( v = dua.split( 'Netscape/' )[ 1 ] ){
\r
597 X_UA[ 'NN' ] = parseFloat( v ) || 7;
\r
598 console.log( '>> NN : ' + X_UA[ 'NN' ] + ', Gecko : ' + X_UA[ 'Gecko' ] );
\r
600 //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6
\r
601 if( v = dua.split( 'Navigator/' )[ 1 ] ){
\r
602 X_UA[ 'NN' ] = parseFloat( v ) || 9;
\r
603 console.log( '>> NN : ' + X_UA[ 'NN' ] + ', Gecko : ' + X_UA[ 'Gecko' ] );
\r
606 console.log( '>> Gecko : ' + X_UA[ 'Gecko' ] );
\r
609 // Android 標準ブラウザ AOSP と ChromeWeb View, Sブラウザがある
\r
610 if( ( v = X_UA[ 'Android' ] ) && ( dua.indexOf( 'Chrome\/' ) < 0 || 0 < dua.indexOf( 'Version\/' ) ) ){ // Chrome/ を含まない または Version/ を含む
\r
612 /* if( window.chrome ){ // Android3.1 のAOSPブラウザで .chrome がいた、、、
\r
614 if( dua.indexOf( 'Version\/' ) < 0 && 0 < dua.indexOf( 'Chrome\/' ) ){
\r
616 * Android 標準ブラウザ Chrome WebView ブラウザ
\r
617 * @alias X.UA.ChromeWV
\r
620 X_UA[ 'ChromeWV' ] = v;
\r
622 // http://uupaa.hatenablog.com/entry/2014/04/15/163346
\r
623 // Chrome WebView は Android 4.4 の時点では WebGL や WebAudio など一部の機能が利用できません(can i use)。
\r
624 // また UserAgent が書き換え可能なため、旧来のAOSPブラウザの UserAgent を偽装した形で配布されているケースがあります。
\r
625 // http://caniuse.com/#compare=chrome+40,android+4.2-4.3,android+4.4,android+4.4.3-4.4.4,and_chr+45
\r
626 // CustomElement の有無で判定
\r
627 if( document[ 'registerElement' ] ){
\r
628 // UA が偽装された Chrome WebView
\r
629 X_UA[ 'ChromeWV' ] = v;
\r
632 * Android 標準ブラウザ AOSP
\r
636 X_UA[ 'AOSP' ] = v;
\r
640 * http://www.flexfirm.jp/blog/article/402
\r
642 * SC-04E、SC-01F、SC-02F、 SC-04F、SCL22、SCL23など
\r
645 // Blink Chrome & Blink Opera
\r
646 if( v = parseFloat( dua.split( 'OPR/' )[ 1 ] ) ){
\r
648 * @alias X.UA.BlinkOpera
\r
651 X_UA[ 'BlinkOpera' ] = v;
\r
653 X_UA[ 'Blink' ] = parseFloat( dua.split( 'Chrome/' )[ 1 ] );
\r
655 if( window.chrome ){
\r
657 * @alias X.UA.Blink
\r
660 X_UA[ 'Blink' ] = parseFloat( dua.split( 'Chrome/' )[ 1 ] );
\r
662 console.log( '>>Blink : ' + X_UA[ 'Blink' ] );
\r
664 if( dav.indexOf( 'Konqueror' ) !== -1 ){
\r
666 * @alias X.UA.Khtml
\r
669 X_UA[ 'Khtml' ] = tv;
\r
670 console.log( '>>Khtml : ' + X_UA[ 'Khtml' ] );
\r
673 if( v = parseFloat( dua.split( 'WebKit\/' )[ 1 ] ) ){
\r
675 * @alias X.UA.WebKit
\r
678 X_UA[ 'WebKit' ] = v;
\r
680 if( v = parseFloat( dua.split( 'Chrome\/' )[ 1 ] ) ){
\r
682 * @alias X.UA.Chrome
\r
685 X_UA[ 'Chrome' ] = v;
\r
687 if( dua.indexOf( 'Safari' ) !== -1 ){
\r
688 if( v = parseFloat( dav.split( 'Version/' )[ 1 ] ) ){
\r
690 * @alias X.UA.Safari
\r
693 X_UA[ 'Safari' ] = v;
\r
696 X_UA[ 'Safari' ] = i < 73 ? 0.8 :
\r
704 i <= 525.25 ? 3.1 : 3.2;
\r
708 console.log( '>> Webkit : ' + X_UA[ 'WebKit' ] + ' Safari : ' + X_UA[ 'Safari' ] );
\r
710 if( dua.toLowerCase().indexOf( 'iris' ) !== -1 ){
\r
712 * http://www.useragentstring.com/pages/Iris/
\r
716 X_UA[ 'Iris' ] = true;
\r
719 if( // Kobo Mozilla/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit/533.1 (KHTML, like Gecko) Verson/4.0 Mobile Safari/533.1 (Kobo Touch)
\r
720 dua.indexOf( 'Kobo' ) !== -1 ||
\r
721 // Kindle paperwhite Mozilla/5.0 (X11; U; Linux armv7l like Android; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/533.2+ Kindle/3.0+
\r
722 dua.indexOf( 'Kindle' ) !== -1 ||
\r
723 // Sony Reader Mozilla/5.0 (Linux; U; ja-jp; EBRD1101; EXT) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
\r
724 dua.indexOf( 'EBRD' ) !== -1
\r
727 * Kobo, Kindle, Sony Reader
\r
731 X_UA[ 'EInk' ] = true;
\r
739 if( X_UA[ 'IE45' ] || X_UA[ 'IE4' ] ){
\r
740 if( X_UA[ 'Mac' ] ){
\r
741 X_UA_classNameForHTML = 'Mac';
\r
743 if( X_UA[ 'WinCE' ] ){
\r
744 // TODO CE3 の ie4 と WM の ie4 の分岐
\r
745 X_UA_classNameForHTML = 'WinCE';
\r
747 if( X_UA[ 'Windows' ] ){
\r
748 X_UA_classNameForHTML = 'Win';
\r
750 X_UA_classNameForHTML = 'Other';
\r
753 X_UA_classNameForHTML += '_IE4';
\r
755 if( X_UA[ 'IE45' ] ){
\r
756 X_UA_classNameForHTML += '5';
\r
759 if( X_UA[ 'ActiveX' ] ){
\r
760 X_UA_classNameForHTML += '_ActiveX';
\r
767 X_UA_classNameForHTML += k + ' ';
\r
769 X_UA_classNameForHTML += k + v + ' ';
\r
781 * http://d.hatena.ne.jp/t-uchima/20051003/p1
\r
782 * MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。
\r
784 if( X_UA[ 'IE4' ] && X_UA[ 'IE' ] < 5 ){ // ie4 & iemobi4 & macie4.x
\r
785 X_UA_DOM.IE4 = true;
\r
786 X_UA_EVENT.IE4 = true;
\r
788 if( X_UA[ 'MacIE' ] ){
\r
789 X_UA_DOM.W3C = true;
\r
790 X_UA_EVENT.IE = true;
\r
792 if( document.getElementById ){
\r
793 X_UA_DOM.W3C = true;
\r
794 if( document.addEventListener ){
\r
795 X_UA_EVENT.W3C = true;
\r
797 if( document.attachEvent ){
\r
798 X_UA_EVENT.IE = true;
\r
800 X_UA_EVENT.DOM0 = true;
\r
804 var X_elmHtml = document.documentElement ||
\r
805 X_UA_DOM.W3C ? document.getElementsByTagName( 'html' )[ 0 ] :
\r
806 X_UA_DOM.IE4 ? document.all.tags( 'html' )[ 0 ] : null,
\r
809 X_UA_DOM.W3C ? document.getElementsByTagName( 'head' )[ 0 ] :
\r
810 X_UA_DOM.IE4 ? document.all.tags( 'head' )[ 0 ] : null,
\r
814 if( navigator.msPointerEnabled || navigator.pointerEnabled ) X_UA_HID.POINTER = true;
\r
815 if( !X_UA_HID.POINTER && window.ontouchstart !== undefined ) X_UA_HID.TOUCH = true;
\r
817 //alert(X_UA[ 'Safari' ] + ' ' + X_UA[ 'WebKit' ] + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );
\r
819 // Safari 3.1 未満は開発コンソールがない!
\r
820 // http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html
\r
822 if( X_UA[ 'Safari' ] && X_UA[ 'WebKit' ] < 525.13 ){
\r
823 window.onerror = function( x, y, z ){
\r
824 var n = String.fromCharCode( 10 );
\r
825 alert('window.onerrorによるエラーの捕捉:' + n + x + n + y + 'の' + z + '行目付近です。');
\r
831 * HTML5 に対応しない IE8 以下でも <a> の下に <div> を作ることができる
\r
832 * その際に <div> の直前に改行文字が出現するが childNodes は長さ 1 で <div> だけの模様、、、
\r
833 X_UA_ATagWrapDiv = (function( e, h ){
\r
834 e = document.createElement( 'div' );
\r
835 e.innerHTML = h = '<a><div></div></a>';
\r
836 console.log( e.innerHTML.length + '\n' + e.firstChild.tagName );
\r
837 return e.childNodes.length === 1;
\r
840 console.log( 'HTML5? ' + X_UA_ATagWrapDiv ); */
\r
842 var X_Script_VBS_ENABLED = X_UA[ 'Windows' ] && !X_UA[ 'WinCE' ] && !X_UA[ 'WinPhone' ] && X_UA[ 'IE' ] < 11,
\r
843 // 構文のサポート instanceof, in(for-in ではない), try-catch. JS version 1.5以上
\r
844 X_Script_gte15 = !( X_UA[ 'IE' ] < 5.5 ) && ( new Function( 'f,a', 'try{return f.apply({},a)}catch(e){}' ) );
\r
848 * @namespace X.Script
\r
853 'tryCatch' : X_Script_try
\r
856 if( X_Script_VBS_ENABLED ){
\r
857 X_Script_gte15 || document.write( '<script type=text/vbscript>' +
\r
859 'Function vbs_testAXO(v)',
\r
860 'On Error Resume Next',
\r
861 'Set ax = CreateObject(v)',
\r
862 'If Err.Number Then',
\r
866 'vbs_testAXO = ax',
\r
869 'Function vbs_try(jsFunc,a1,a2,a3,a4)',
\r
870 'On Error Resume Next',
\r
871 'Set rs = jsFunc(a1,a2,a3,a4)',
\r
872 'If Err.Number != 0 Then',
\r
879 // elementID .SRC = v
\r
880 'Function vbs_setValue(id,k,v)',
\r
881 'On Error Resume Next',
\r
883 'Document.all[id][k]=v',
\r
884 'If Err.Number != 0 Then',
\r
894 ].join( '\n' ) + '</script>' );
\r
896 // TODO Object のメンバを辿る vba
\r
897 // byte Array を扱う vba
\r
900 function X_Script_try( func, args ){
\r
901 if( !X_Script_gte15 ){
\r
902 //return func.apply( {}, args );
\r
905 return X_Script_gte15( func, args || [] );
\r
908 function X_Script_createActiveXObjectSafty( name ){
\r
909 if( !X_Script_gte15 ){
\r
910 if( X_Script_VBS_ENABLED ){
\r
911 // console.log( window[ 'vbs_testAXO' ]( name ) + ' ' + name );
\r
912 return !window[ 'vbs_testAXO' ]( name ) && X_Script_createActiveXObject( name );
\r
914 return X_Script_createActiveXObject( name );
\r
917 return X_Script_try( X_Script_createActiveXObject, [ name ] );
\r
920 // TODO GeckoActiveX
\r
921 function X_Script_createActiveXObject( name ){
\r
922 return new ActiveXObject( name );
\r
926 * http://archiva.jp/web/html-css/ie6_background_flickr.html
\r
927 * hover時の背景画像ちらつきに対処する
\r
928 * この問題はIE6固有の問題であり、他のモダンブラウザやIE5等では発現しない。
\r
930 if( X_UA[ 'IE6' ] && // error @ NN7.2
\r
931 !X_Script_try( function(){ document.execCommand( 'BackgroundImageCache', false, true ); return 1; } ) ){
\r
933 * ie6 のみで実行する document.execCommand( 'BackgroundImageCache', false, true ) の失敗。
\r
934 * bonus: hotfix for IE6 SP1 (bug KB823727)
\r
935 * multipleIEs IE6 standalone 版では不可, IE5.5 は可,,,
\r
936 * @alias X.UA.ieExeComError */
\r
937 X_UA[ 'ieExeComError' ] = true;
\r