X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F01_core%2F02_XUA.js;h=896be7eeb1d216f6e3ffc4e8d3981c24b6602cd5;hb=dd4fcb6269ff74be253a767826aa5dfb96dd4acc;hp=ec338a8f8012139c1909a55c9f185f1822570b51;hpb=241005e2a5f9f8a7fddd6f610b76a915e9c05d30;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/01_core/02_XUA.js b/0.6.x/js/01_core/02_XUA.js index ec338a8..896be7e 100644 --- a/0.6.x/js/01_core/02_XUA.js +++ b/0.6.x/js/01_core/02_XUA.js @@ -53,9 +53,8 @@ var X_UA = X[ 'UA' ] = {}, */ X_UA[ 'iOS' ] = X_UA[ 'iOSMajor' ] + X_UA[ 'iOSMinor' ] / 10; - if( screen.width === screen.height * 1.5 || screen.width * 1.5 === screen.height ){ - v = true; // 4:3 model - }; + // 4:3 model + v = screen.width === screen.height * 1.5 || screen.width * 1.5 === screen.height; if( sys === 'iPhone' ){ /** @@ -155,14 +154,14 @@ var X_UA = X[ 'UA' ] = {}, * @type {boolean} */ X_UA[ sys ] = true; - - if( v = dav.split( 'Windows NT 10' )[ 1 ] ){ + + if( v = dua.split( 'Windows NT 10' )[ 1 ] ){ switch( v.substr( 0, 2 ) ){ case '.0' : v = 10; break; default : v = '?'; }; } else - if( v = dav.split( 'Windows NT ' )[ 1 ] ){ + if( v = dua.split( 'Windows NT ' )[ 1 ] ){ switch( v.substr( 0, 3 ) ){ case '6.3' : v = 8.1; break; case '6.2' : v = 8; break; @@ -173,9 +172,9 @@ var X_UA = X[ 'UA' ] = {}, case '5.0' : v = v.indexOf( '5.01' ) ? 2000 : '2kSP1'; break; case '4.0' : v = 'NT'; break; default : v = '?'; - }; + }; } else - if( v = dav.split( 'Windows ' )[ 1 ] ){ + if( v = dua.split( 'Windows ' )[ 1 ] ){ switch( v.substr( 0, 2 ) ){ case '98' : v = v.indexOf( '98; Win 9x 4.90' ) ? '98|98SE' : 'ME'; break; case '95' : v = 95; break; @@ -231,9 +230,9 @@ var X_UA = X[ 'UA' ] = {}, * @type {boolean} */ X_UA[ 'Linux' ] = true; - - if( dua.indexOf( 'Android ' ) !== -1 ){ - v = dua.split( 'Android ' )[ 1 ].split( '.' ); + + if( v = dua.split( 'Android ' )[ 1 ] ){ + v = v.split( '.' ); /** * @alias X.UA.AndroidMajor * @type {number} @@ -260,94 +259,110 @@ var X_UA = X[ 'UA' ] = {}, * @alias X.UA.Android * @type {number} */ - X_UA[ 'Android' ] = X_UA[ 'AndroidMajor' ] + X_UA[ 'AndroidMinor' ] / 10; + X_UA[ 'Android' ] = X_UA[ 'AndroidMajor' ] + X_UA[ 'AndroidMinor' ] / 10; console.log( '>> Android : ' + X_UA[ 'Android' ] ); - } else - if( dua.indexOf( 'Android;' ) !== -1 ){ - // Fennec41- 用 - // https://developer.mozilla.org/ja/docs/Gecko_user_agent_string_reference - // バージョン 41 以降の Android 版 Firefox では platform トークンに Android バージョンが含まれます。 - // 相互運用性向上のため、Android 4 以前のバージョンでブラウザが動作している場合は 4.4 と出力します。 - // Android バージョン 4 以降では実際のバージョン番号が出力されます。 - // なお、Gecko エンジンはすべての Android バージョンに対して同じ機能を提供しています。 - X_UA[ 'Android' ] = 2.2; }; }; if( window.opera ){ - i = dua.indexOf( 'Opera' ); // Opera/ - j = dua.indexOf( 'Version/' ); + i = dua.split( 'Opera' )[ 1 ]; // Opera/ + j = dua.split( 'Version/' )[ 1 ]; /** * @alias X.UA.Opera * @type {number} */ - X_UA[ 'Opera' ] = v = Math.max( - i !== -1 ? parseFloat( dua.substr( i + 6 ) ) : 0, - j !== -1 ? parseFloat( dua.substr( j + 8 ) ) : 0, - tv ); + X_UA[ 'Opera' ] = v = Math.max( parseFloat( i ) || 0, parseFloat( j ) || 0, tv ); /** * memo:closure compiler で minify するとOpera7で動かない * --compilation_level WHITESPACE_ONLY --formatting pretty_print <- 動く * @alias X.UA.Opera7 * @type {boolean} */ - X_UA[ 'Opera7' ] = v < 8; + X_UA[ 'Opera7' ] = v < 8; /** * @alias X.UA.Opera78 * @type {boolean} */ - X_UA[ 'Opera78' ] = v < 9; - /** - * @alias X.UA.OperaMini - * @type {boolean} - */ - X_UA[ 'OperaMini' ] = 0 < dua.indexOf('Opera Mini'); - /** - * @alias X.UA.OperaMobile - * @type {boolean} - */ - X_UA[ 'OperaMobile' ] = 0 < dua.indexOf('Opera Mobi'); - /** - * @alias X.UA.OperaTablet - * @type {boolean} - */ - X_UA[ 'OperaTablet' ] = 0 < dua.indexOf('Opera Tablet'); - /** - * @alias X.UA.Wii - * @type {boolean} - */ - X_UA[ 'Wii' ] = dua.indexOf( 'Nintendo Wii' ) !== -1; - /** - * @alias X.UA.NDS - * @type {boolean} - */ - X_UA[ 'NDS' ] = dua.indexOf( 'Nitro' ) !== -1; + X_UA[ 'Opera78' ] = v < 9; + + if( 0 < dua.indexOf( 'Opera Mini' ) ) + /** + * @alias X.UA.OperaMini + * @type {boolean} + */ + X_UA[ 'OperaMini' ] = true; + + if( 0 < dua.indexOf( 'Opera Mobi' ) ) + /** + * @alias X.UA.OperaMobile + * @type {boolean} + */ + X_UA[ 'OperaMobile' ] = true; + + if( 0 < dua.indexOf('Opera Tablet') ) + /** + * @alias X.UA.OperaTablet + * @type {boolean} + */ + X_UA[ 'OperaTablet' ] = true; + + if( 0 < dua.indexOf( 'Nintendo Wii' ) ) + /** + * @alias X.UA.Wii + * @type {boolean} + */ + X_UA[ 'Wii' ] = true; + + if( 0 < dua.indexOf( 'Nitro' ) ) + /** + * @alias X.UA.NDS + * @type {boolean} + */ + X_UA[ 'NDS' ] = true; + console.log( '>> Opera : ' + v ); } else - - // Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko - if( document.all || dav.indexOf( 'Trident/' ) !== -1 ){ + if( v = parseFloat( dav.split( 'Edge/' )[ 1 ] ) ){ /** - * @alias X.UA.ActiveX - * @type {boolean} - */ - X_UA[ 'ActiveX' ] = !!window[ 'ActiveXObject' ]; - /** - * documentモードを考慮しないIEのバージョン - * @alias X.UA._IE + * Microsoft Edge + * @alias X.UA.Edge * @type {number} */ - X_UA[ '_IE' ] = parseFloat(dua.split('MSIE ')[1]) || parseFloat(dua.split('rv:')[1]) || parseFloat(dav.split('MSIE ')[1]) || 0; + X_UA[ 'Edge' ] = v; + + if( dav.indexOf( 'Mobile' ) ){ + /** + * Microsoft Edge for Windows 10 Mobile + * @alias X.UA.EdgeMobile + * @type {number} + */ + X_UA[ 'EdgeMobile' ] = v; + }; + + } else + // Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko + if( ( v = dav.split( 'Trident/' )[ 1 ] ) || document.all ){ // .all は Opera にもいるので Opera の判定が先 + if( v = parseFloat( v ) ) /** * IE11 の互換モードの navigator.appVersion にも Trident/7.0 が書かれているため互換モードか?判定ができるc * @alias X.UA.Trident * @type {number} */ - X_UA[ 'Trident' ] = parseFloat(dav.split('Trident/')[1]) || 0; + X_UA[ 'Trident' ] = v; - tridentToVer = X_UA[ 'Trident' ] ? ( X_UA[ 'Trident' ] + 4 | 0 ) : X_UA[ '_IE' ]; + if( window[ 'ActiveXObject' ] ) + /** + * @alias X.UA.ActiveX + * @type {boolean} + */ + X_UA[ 'ActiveX' ] = true; + + v = parseFloat( dua.split( 'MSIE ' )[ 1 ] ) || + parseFloat( dua.split( 'rv:' )[ 1 ] ) || 0; - if( tridentToVer !== X_UA[ '_IE' ] ){ + tridentToVer = X_UA[ 'Trident' ] ? ( X_UA[ 'Trident' ] + 4 | 0 ) : v; + + if( tridentToVer !== v ){ /** * IE10 以上の互換モードを使用している場合、そのバージョン * @alias X.UA.IEHost @@ -360,7 +375,7 @@ var X_UA = X[ 'UA' ] = {}, * @alias X.UA.IE * @type {number} */ - X_UA[ 'IE' ] = v = document.documentMode || tridentToVer; + X_UA[ 'IE' ] = v = document.documentMode || tridentToVer; if( v < 4.5 ){ /** @@ -443,7 +458,7 @@ var X_UA = X[ 'UA' ] = {}, X_UA[ 'MacIE' ] = true; }; - if( dua.toLowerCase().indexOf( 'iemobile' ) !== -1 || X_UA[ 'WinCE' ] ){ + if( 0 < dua.toLowerCase().indexOf( 'iemobile' ) || X_UA[ 'WinCE' ] ){ /** * @alias X.UA.IEMobile * @type {boolean} @@ -451,7 +466,7 @@ var X_UA = X[ 'UA' ] = {}, X_UA[ 'IEMobile' ] = true; }; - if( dua.toLowerCase().indexOf( 'windows phone' ) !== -1 || 0 < dav.indexOf( 'ZuneWP' ) ){ + if( 0 < dua.toLowerCase().indexOf( 'windows phone' ) || 0 < dav.indexOf( 'ZuneWP' ) ){ /** * @alias X.UA.WinPhone * @type {boolean} @@ -464,13 +479,13 @@ var X_UA = X[ 'UA' ] = {}, } else // - if( ( i = dua.indexOf( 'NetFront\/' ) !== -1 ) ){ + if( v = dua.split( 'NetFront\/' )[ 1 ] ){ /** * http://qa.support.sony.jp/solution/S0812181056444/common/nfb34_dom_200jp/dom_dom0_JP.html * @alias X.UA.NetFront * @type {number} */ - X_UA[ 'NetFront' ] = parseFloat( dua.substr( i + 9 ) ) || 0.1; + X_UA[ 'NetFront' ] = parseFloat( v ) || 0.1; console.log( '>> NetFront : ' + X_UA[ 'NetFront' ] ); } else @@ -479,7 +494,7 @@ var X_UA = X[ 'UA' ] = {}, console.log( '>> NetFront : ' + X_UA[ 'NetFront' ] ); } else - if( ( i = dua.toUpperCase().indexOf( 'PLAYSTATION 3' ) !== -1 ) ){ + if( v = dua.toUpperCase().split( 'PLAYSTATION 3' )[ 1 ] ){ /** * PlayStation 3 システムバージョン 4.10 未満の SONY 独自ブラウザ * http://www.useragentstring.com/pages/Playstation%203/ @@ -490,11 +505,11 @@ var X_UA = X[ 'UA' ] = {}, * @alias X.UA.PS3 * @type {number} */ - X_UA[ 'PS3' ] = parseFloat( dua.substr( i + 15 ) ) || 0.1; + X_UA[ 'PS3' ] = parseFloat( v ) || 0.1; console.log( '>> PS3 : ' + X_UA[ 'PS3' ] ); } else - if( ( i = dua.indexOf( 'iCab' ) !== -1 ) ){ + if( v = dua.split( 'iCab' )[ 1 ] ){ /** * http://www.useragentstring.com/pages/iCab/ * iCab/3.0.2 (Macintosh; U; PPC Mac OS X) @@ -502,12 +517,12 @@ var X_UA = X[ 'UA' ] = {}, * @alias X.UA.iCab * @type {number} */ - X_UA[ 'iCab' ] = parseFloat( dua.substr( i + 5 ) ) || 0.1; + X_UA[ 'iCab' ] = parseFloat( v ) || 0.1; console.log( '>> iCab : ' + X_UA[ 'iCab' ] ); } else - if( 0 < dua.indexOf( 'Gecko\/' ) && ( i = dua.indexOf( 'rv:' ) ) ){ - v = dua.substr( i + 3 ).split( '.' ); + if( 0 < dua.indexOf( 'Gecko\/' ) && ( v = dua.split( 'rv:' )[ 1 ] ) ){ + v = v.split( '.' ); /** * メジャーバージョン + マイナーバージョン * @alias X.UA.Gecko @@ -531,14 +546,28 @@ var X_UA = X[ 'UA' ] = {}, */ X_UA[ 'GeckoPatch' ] = parseFloat( v[ 2 ] ) || 0; + // Fennec41- 用 + // https://developer.mozilla.org/ja/docs/Gecko_user_agent_string_reference + // バージョン 41 以降の Android 版 Firefox では platform トークンに Android バージョンが含まれます。 + // 相互運用性向上のため、Android 4 以前のバージョンでブラウザが動作している場合は 4.4 と出力します。 + // Android バージョン 4 以降では実際のバージョン番号が出力されます。 + // なお、Gecko エンジンはすべての Android バージョンに対して同じ機能を提供しています。 + if( dua.indexOf( 'Android 4.4; Mobile;' ) !== -1 || dua.indexOf( 'Android 4.4; Tablet;' ) !== -1 ){ + X_UA[ 'Android' ] = '2.3+'; + } else + if( dua.indexOf( 'Android;' ) !== -1 ){ + X_UA[ 'Android' ] = '2.2+'; + }; + + // TODO PC版 Fennec もある //Fennec - if( ( i = dua.indexOf( 'Fennec/' ) ) !== -1 ){ + if( v = dua.split( 'Fennec/' )[ 1 ] ){ /** * Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0 * @alias X.UA.Fennec * @type {number} */ - X_UA[ 'Fennec' ] = parseFloat( dua.substr( i + 7 ) ); + X_UA[ 'Fennec' ] = parseFloat( v ); console.log( '>> Fennec : ' + X_UA[ 'Fennec' ] + ', Gecko : ' + X_UA[ 'Gecko' ] ); } else if( X_UA[ 'Android' ] ){ @@ -563,13 +592,13 @@ var X_UA = X[ 'UA' ] = {}, } else //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) //Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3 - if( ( i = dua.indexOf( 'Netscape/' ) ) !== -1 ){ - X_UA[ 'NN' ] = parseFloat( dua.substr( i + 9 ) ) || 7; + if( v = dua.split( 'Netscape/' )[ 1 ] ){ + X_UA[ 'NN' ] = parseFloat( v ) || 7; console.log( '>> NN : ' + X_UA[ 'NN' ] + ', Gecko : ' + X_UA[ 'Gecko' ] ); } else //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 - if( ( i = dua.indexOf( 'Navigator/' ) ) !== -1 ){ - X_UA[ 'NN' ] = parseFloat( dua.substr( i + 10 ) ) || 9; + if( v = dua.split( 'Navigator/' )[ 1 ] ){ + X_UA[ 'NN' ] = parseFloat( v ) || 9; console.log( '>> NN : ' + X_UA[ 'NN' ] + ', Gecko : ' + X_UA[ 'Gecko' ] ); }; @@ -577,8 +606,7 @@ var X_UA = X[ 'UA' ] = {}, } else // Android 標準ブラウザ AOSP と ChromeWeb View, Sブラウザがある - if( ( v = X_UA[ 'Android' ] ) && - ( dua.indexOf( 'Chrome\/' ) < 0 || 0 < dua.indexOf( 'Version\/' ) ) ){ // Chrome/ を含まない または Version/ を含む + if( ( v = X_UA[ 'Android' ] ) && ( dua.indexOf( 'Chrome\/' ) < 0 || 0 < dua.indexOf( 'Version\/' ) ) ){ // Chrome/ を含まない または Version/ を含む /* if( window.chrome ){ // Android3.1 のAOSPブラウザで .chrome がいた、、、 } else */ @@ -613,24 +641,24 @@ var X_UA = X[ 'UA' ] = {}, * SC-04E、SC-01F、SC-02F、 SC-04F、SCL22、SCL23など */ } else - // Blink Chrome & Blink Opera + if( v = parseFloat( dua.split( 'OPR/' )[ 1 ] ) ){ + /** + * @alias X.UA.BlinkOpera + * @type {number} + */ + X_UA[ 'BlinkOpera' ] = v; + + X_UA[ 'Blink' ] = parseFloat( dua.split( 'Chrome/' )[ 1 ] ); + } else if( window.chrome ){ /** * @alias X.UA.Blink * @type {number} */ X_UA[ 'Blink' ] = parseFloat( dua.split( 'Chrome/' )[ 1 ] ); - - if( v = parseFloat( dua.split( 'OPR/' )[ 1 ] ) ){ - /** - * @alias X.UA.BlinkOpera - * @type {number} - */ - X_UA[ 'BlinkOpera' ] = v; - }; + console.log( '>>Blink : ' + X_UA[ 'Blink' ] ); - } else if( dav.indexOf( 'Konqueror' ) !== -1 ){ /** @@ -641,47 +669,40 @@ var X_UA = X[ 'UA' ] = {}, console.log( '>>Khtml : ' + X_UA[ 'Khtml' ] ); } else - - if( i = parseFloat(dua.split('WebKit\/')[1]) ){ + if( v = parseFloat( dua.split( 'WebKit\/' )[ 1 ] ) ){ /** * @alias X.UA.WebKit * @type {number} */ - X_UA[ 'WebKit' ] = i; + X_UA[ 'WebKit' ] = v; - if( v = parseFloat(dua.split('Chrome\/')[1]) ){ + if( v = parseFloat( dua.split( 'Chrome\/' )[ 1 ] ) ){ /** * @alias X.UA.Chrome * @type {number} */ X_UA[ 'Chrome' ] = v; - }; - - // TODO webkit Opera - - console.log( '>>Webkit : ' + X_UA[ 'WebKit' ] ); - - if( i && !X_UA[ 'Chrome' ] && dua.indexOf( 'Safari' ) !== -1 ){ - if( dav.indexOf( 'Version/' ) !== -1 ){ + } else + if( dua.indexOf( 'Safari' ) !== -1 ){ + if( v = parseFloat( dav.split( 'Version/' )[ 1 ] ) ){ /** * @alias X.UA.Safari * @type {number} */ - X_UA[ 'Safari' ] = parseFloat( dav.split('Version/')[1] ); - } else { - if( i <= 528.16 ){ - X_UA[ 'Safari' ] = i < 73 ? 0.8 : - i < 85 ? 0.9 : - i < 100 ? 1 : - i < 125 ? 1.1 : - i < 312 ? 1.2 : - i < 412 ? 1.3 : - i <= 419.3 ? 2 : - i <= 525.13 ? 3 : - i <= 525.25 ? 3.1 : 3.2; - }; + X_UA[ 'Safari' ] = v; + } else + if( i <= 528.16 ){ + X_UA[ 'Safari' ] = i < 73 ? 0.8 : + i < 85 ? 0.9 : + i < 100 ? 1 : + i < 125 ? 1.1 : + i < 312 ? 1.2 : + i < 412 ? 1.3 : + i <= 419.3 ? 2 : + i <= 525.13 ? 3 : + i <= 525.25 ? 3.1 : 3.2; }; - }; + }; console.log( '>> Webkit : ' + X_UA[ 'WebKit' ] + ' Safari : ' + X_UA[ 'Safari' ] ); @@ -714,6 +735,7 @@ var X_UA = X[ 'UA' ] = {}, (function(){ var k, v; + if( X_UA[ 'IE45' ] || X_UA[ 'IE4' ] ){ if( X_UA[ 'Mac' ] ){ X_UA_classNameForHTML = 'Mac'; @@ -722,20 +744,20 @@ var X_UA = X[ 'UA' ] = {}, // TODO CE3 の ie4 と WM の ie4 の分岐 X_UA_classNameForHTML = 'WinCE'; } else - if( X_UA[ 'Win' ] ){ + if( X_UA[ 'Windows' ] ){ X_UA_classNameForHTML = 'Win'; } else { X_UA_classNameForHTML = 'Other'; }; - X_UA_classNameForHTML += 'IE4'; + X_UA_classNameForHTML += '_IE4'; if( X_UA[ 'IE45' ] ){ X_UA_classNameForHTML += '5'; }; if( X_UA[ 'ActiveX' ] ){ - X_UA_classNameForHTML += 'ActiveX'; + X_UA_classNameForHTML += '_ActiveX'; }; } else { @@ -816,101 +838,3 @@ X_UA_ATagWrapDiv = (function( e, h ){ })(); console.log( 'HTML5? ' + X_UA_ATagWrapDiv ); */ - -var X_Script_VBS_ENABLED = X_UA[ 'Windows' ] && !X_UA[ 'WinCE' ] && !X_UA[ 'WinPhone' ] && X_UA[ 'IE' ] < 11, - // 構文のサポート instanceof, in(for-in ではない), try-catch. JS version 1.5以上 - X_Script_gte15 = !( X_UA[ 'IE' ] < 5.5 ) && ( new Function( 'f,a', 'try{return f.apply({},a)}catch(e){}' ) ); - -/** - * js バージョン間の際を吸収 - * @namespace X.Script - * @alias X.Script - * @type {object} - */ -X[ 'Script' ] = { - 'tryCatch' : X_Script_try -}; - -if( X_Script_VBS_ENABLED ){ - X_Script_gte15 || document.write( '' ); - - // TODO Object のメンバを辿る vba - // byte Array を扱う vba -}; - -function X_Script_try( func, args ){ - if( !X_Script_gte15 ){ - //return func.apply( {}, args ); - return; - }; - return X_Script_gte15( func, args || [] ); -}; - -function X_Script_createActiveXObjectSafty( name ){ - if( !X_Script_gte15 ){ - if( X_Script_VBS_ENABLED ){ - // console.log( window[ 'vbs_testAXO' ]( name ) + ' ' + name ); - return !window[ 'vbs_testAXO' ]( name ) && X_Script_createActiveXObject( name ); - }; - return X_Script_createActiveXObject( name ); - }; - - return X_Script_try( X_Script_createActiveXObject, [ name ] ); -}; - -function X_Script_createActiveXObject( name ){ - return new ActiveXObject( name ); -}; - -/* - * http://archiva.jp/web/html-css/ie6_background_flickr.html - * hover時の背景画像ちらつきに対処する - * この問題はIE6固有の問題であり、他のモダンブラウザやIE5等では発現しない。 - */ -if( X_UA[ 'IE6' ] && // error @ NN7.2 - !X_Script_try( function(){ document.execCommand( 'BackgroundImageCache', false, true ); return 1; } ) ){ - /** - * ie6 のみで実行する document.execCommand( 'BackgroundImageCache', false, true ) の失敗。 - * bonus: hotfix for IE6 SP1 (bug KB823727) - * multipleIEs IE6 standalone 版では不可, IE5.5 は可,,, - * @alias X.UA.ieExeComError */ - X_UA[ 'ieExeComError' ] = true; -}; -