X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F01_core%2F02_XUA.js;h=acf31f409a872d86563a5e018fcbc1c3a7ccad49;hb=HEAD;hp=4a6228c74b6b195445dcf1ca7ac9a471acbd9e20;hpb=a4c3d3a22b13112b3317a6ffd3eff2272c2264f1;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 4a6228c..acf31f4 100644 --- a/0.6.x/js/01_core/02_XUA.js +++ b/0.6.x/js/01_core/02_XUA.js @@ -10,14 +10,14 @@ * @type {object} */ var X_UA = X[ 'UA' ] = {}, - X_UA_classNameForHTML = 'js-enabled '; + X_UA_classNameForHTML = ''; (function(){ var dua = navigator.userAgent, dav = navigator.appVersion, tv = parseFloat(dav), sys = navigator.platform, - tridentToVer, i, j, v; + tridentToVer, i, j, v, androidBrowserPCMode; console.log( ' userAgent : ' + dua ); console.log( '-' ); @@ -30,7 +30,7 @@ var X_UA = X[ 'UA' ] = {}, if( sys.indexOf( 'iP' ) === 0 ){ - v = dua.split( 'OS ' )[ 1 ].split( '_' ); + v = dav.split( 'OS ' )[ 1 ].split( '_' ); i = window.devicePixelRatio === 1; /** * @alias X.UA.iOSMajor @@ -51,78 +51,81 @@ var X_UA = X[ 'UA' ] = {}, * @alias X.UA.iOS * @type {number} */ - X_UA[ 'iOS' ] = X_UA[ 'iOSMajor' ] + X_UA[ 'iOSMinor' ] / 10; + 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 - }; - - if( sys === 'iPhone' ){ - /** - * @alias X.UA.iPhone - * @type {boolean} - */ - X_UA[ 'iPhone' ] = true; - if( v ){ + // 4:3 model + v = screen.width === screen.height * 1.5 || screen.width * 1.5 === screen.height; + + switch( sys ){ + case 'iPhone' : + case 'iPhone Simulator' : /** - * iPhone4s以下 - * @alias X.UA.iPhone_4s + * @alias X.UA.iPhone * @type {boolean} */ - X_UA[ 'iPhone_4s' ] = true; - - if( i ){ + X_UA[ 'iPhone' ] = true; + if( v ){ /** - * iPhone3GS以下 - * @alias X.UA.iPhone_3GS + * iPhone4s以下 + * @alias X.UA.iPhone_4s * @type {boolean} */ - X_UA[ 'iPhone_3GS' ] = true; - }; - }; - - //alert( 'iPhone ' + ( X_UA[ 'iPhone_3GS' ] ? '3GS以下' : X_UA[ 'iPhone_4s' ] ? '4s以下' : '5以上' ) ); - }; - if( sys === 'iPad' ){ - /** - * @alias X.UA.iPad - * @type {boolean} - */ - X_UA[ 'iPad' ] = true; - if( i ){ + X_UA[ 'iPhone_4s' ] = true; + + if( i ){ + /** + * iPhone3GS以下 + * @alias X.UA.iPhone_3GS + * @type {boolean} + */ + X_UA[ 'iPhone_3GS' ] = true; + }; + }; + break; + + case 'iPad' : + case 'iPad Simulator' : /** - * iPad2以下または初代iPad mini 以下 - * @alias X.UA.iPad_2Mini1 + * @alias X.UA.iPad * @type {boolean} */ - X_UA[ 'iPad_2Mini1' ] = true; - }; - }; - if( sys === 'iPod' ){ - /** - * @alias X.UA.iPod - * @type {boolean} - */ - X_UA[ 'iPod' ] = true; - - if( v ){ + X_UA[ 'iPad' ] = true; + if( i ){ + /** + * iPad2以下または初代iPad mini 以下 + * @alias X.UA.iPad_2Mini1 + * @type {boolean} + */ + X_UA[ 'iPad_2Mini1' ] = true; + }; + break; + + case 'iPod' : + case 'iPod Simulator' : // 必要?? /** - * iPod4以下 - * @alias X.UA.iPod_4 + * @alias X.UA.iPod * @type {boolean} */ - X_UA[ 'iPod_4' ] = true; - - if( i ){ + X_UA[ 'iPod' ] = true; + + if( v ){ /** - * iPod3以下 - * @alias X.UA.iPod_3 + * iPod4以下 + * @alias X.UA.iPod_4 * @type {boolean} */ - X_UA[ 'iPod_3' ] = true; - }; - }; - //alert( 'iPod touch ' + ( X_UA[ 'iPod_3' ] ? '3以下' : X_UA[ 'iPod_4' ] ? '4以下' : '5以上' ) ); + X_UA[ 'iPod_4' ] = true; + + if( i ){ + /** + * iPod3以下 + * @alias X.UA.iPod_3 + * @type {boolean} + */ + X_UA[ 'iPod_3' ] = true; + }; + }; + break; }; console.log( '>> iOS : ' + X_UA[ 'iOS' ] ); @@ -155,14 +158,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 +176,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; @@ -230,9 +233,8 @@ var X_UA = X[ 'UA' ] = {}, * @alias X.UA.Linux * @type {boolean} */ - X_UA[ 'Linux' ] = true; - - if( v = dua.split( 'Android ' )[ 1 ] ){ + if( ( v = dua.split( 'Android ' )[ 1 ] ) || + ( v = sys.split( 'Android ' )[ 1 ] ) ){ // PCモードの Android Firefox では platform に Android 0.0.0 が存在 v = v.split( '.' ); /** * @alias X.UA.AndroidMajor @@ -262,6 +264,36 @@ var X_UA = X[ 'UA' ] = {}, */ X_UA[ 'Android' ] = X_UA[ 'AndroidMajor' ] + X_UA[ 'AndroidMinor' ] / 10; console.log( '>> Android : ' + X_UA[ 'Android' ] ); + } else + if( ( sys === 'Linux armv7l' || sys === 'Linux i686' ) && window.ontouchstart !== undefined && ( v = parseFloat( dua.split( 'WebKit\/' )[ 1 ] ) ) ){ + // https://ja.wikipedia.org/wiki/WebKit + // http://www.au.kddi.com/developer/android/kishu/ua/ + // webkit version to Android version... + androidBrowserPCMode = !window.chrome || v < 534.3; // 4.0 & 3.x には chrome がいる... + + if( !window[ 'Int8Array' ] ){ + v = + v < 529 ? 1.5 : // <= 528.5 + v < 531 ? 2.0 : // 530 2.0~2.1 + // 533 2.2~2.3 + v < 534 ? ( window.HTMLAudioElement ? 2.3 : 2.2 ) : 0; + } else { + v = + !navigator[ 'connection' ] ? 4.4 : + Number.isFinite && ( window.history && window.history.pushState ) ? 4.2/* & 4.3 */ : // ここに 4.1, 4.0 も入ってくる... + Number.isFinite ? 4.1 : 4; + // 534 - 3.x~4.x , 534.13=3.x + // 534.30 = 4.0-4.1 + // 535.19 = 4.1 + // 537.36 = 4.4.2-5.x + }; + + if( v ){ + // PC版で見る、にチェックが付いている場合、ユーザーエージェント文字列にも platform にも Android の文字列が存在しない(標準ブラウザ&Chrome) + // Audio でタッチが必要か?の判定にとても困る... + // ua には Linux x86_64 になっている + X_UA[ 'Android' ] = v; + }; }; }; @@ -279,12 +311,12 @@ var X_UA = X[ 'UA' ] = {}, * @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; + X_UA[ 'Opera78' ] = v < 9; if( 0 < dua.indexOf( 'Opera Mini' ) ) /** @@ -307,6 +339,16 @@ var X_UA = X[ 'UA' ] = {}, */ X_UA[ 'OperaTablet' ] = true; + // Android Opera12.10 UserAgent:Desktop + // この場合 android version 不明... + if( !X_UA[ 'OperaMini' ] && !X_UA[ 'OperaTablet' ] && !X_UA[ 'OperaMobile' ] && sys === 'Android' ){ + if( screen.width * screen.height < 320000 ){ + X_UA[ 'OperaMobile' ] = true; + } else { + X_UA[ 'OperaTablet' ] = true; + }; + }; + if( 0 < dua.indexOf( 'Nintendo Wii' ) ) /** * @alias X.UA.Wii @@ -323,9 +365,26 @@ var X_UA = X[ 'UA' ] = {}, console.log( '>> Opera : ' + v ); } else - + if( v = parseFloat( dav.split( 'Edge/' )[ 1 ] ) ){ + /** + * Microsoft Edge + * @alias X.UA.Edge + * @type {number} + */ + 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 ){ + if( ( v = dav.split( 'Trident/' )[ 1 ] ) || document.all ){ // .all は Opera にもいるので Opera の判定が先 if( v = parseFloat( v ) ) /** * IE11 の互換モードの navigator.appVersion にも Trident/7.0 が書かれているため互換モードか?判定ができるc @@ -342,8 +401,7 @@ var X_UA = X[ 'UA' ] = {}, X_UA[ 'ActiveX' ] = true; v = parseFloat( dua.split( 'MSIE ' )[ 1 ] ) || - parseFloat( dua.split( 'rv:' )[ 1 ] ) || - parseFloat( dav.split( 'MSIE ' )[ 1 ] ) || 0; + parseFloat( dua.split( 'rv:' )[ 1 ] ) || 0; tridentToVer = X_UA[ 'Trident' ] ? ( X_UA[ 'Trident' ] + 4 | 0 ) : v; @@ -360,7 +418,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 +501,7 @@ var X_UA = X[ 'UA' ] = {}, X_UA[ 'MacIE' ] = true; }; - if( 0 < dua.toLowerCase().indexOf( 'iemobile' ) || X_UA[ 'WinCE' ] ){ + if( 0 < dua.indexOf( 'IEMobile' ) || X_UA[ 'WinCE' ] ){ /** * @alias X.UA.IEMobile * @type {boolean} @@ -451,7 +509,7 @@ var X_UA = X[ 'UA' ] = {}, X_UA[ 'IEMobile' ] = true; }; - if( 0 < dua.toLowerCase().indexOf( 'windows phone' ) || 0 < dav.indexOf( 'ZuneWP' ) ){ + if( 0 < dua.indexOf( 'Windows Phone' ) || 0 < dav.indexOf( 'ZuneWP' ) ){ /** * @alias X.UA.WinPhone * @type {boolean} @@ -591,11 +649,11 @@ 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\/' ) || androidBrowserPCMode ) ){ // Chrome/ を含まない または Version/ を含む /* if( window.chrome ){ // Android3.1 のAOSPブラウザで .chrome がいた、、、 } else */ - if( dua.indexOf( 'Version\/' ) < 0 && 0 < dua.indexOf( 'Chrome\/' ) ){ + if( dua.indexOf( 'Version\/' ) < 0 && 0 < dua.indexOf( 'Chrome\/' ) && !androidBrowserPCMode ){ /** * Android 標準ブラウザ Chrome WebView ブラウザ * @alias X.UA.ChromeWV @@ -676,16 +734,16 @@ var X_UA = X[ 'UA' ] = {}, */ 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; + if( v <= 528.16 ){ + X_UA[ 'Safari' ] = v < 73 ? 0.8 : + v < 85 ? 0.9 : + v < 100 ? 1 : + v < 125 ? 1.1 : + v < 312 ? 1.2 : + v < 412 ? 1.3 : + v <= 419.3 ? 2 : + v <= 525.13 ? 3 : + v <= 525.25 ? 3.1 : 3.2; }; }; @@ -720,6 +778,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'; @@ -728,29 +787,30 @@ 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 { for( k in X_UA ){ v = X_UA[ k ]; if( v ){ - X_UA_classNameForHTML += k + ' '; if( v !== true ){ X_UA_classNameForHTML += k + v + ' '; + } else { + X_UA_classNameForHTML += k + ' '; }; }; }; @@ -822,101 +882,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; -}; -