OSDN Git Service

Version 0.6.94, new X.Callback is fast & light maybe.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 02_XUA.js
index 1f55c6f..41a5bc3 100644 (file)
@@ -1,13 +1,13 @@
 \r
-/*\r
- * UA\r
- */\r
-X.UA = (function( n, undefined ){\r
+// ------------------------------------------------------------------------- //\r
+// ------------ local variables -------------------------------------------- //\r
+// ------------------------------------------------------------------------- //\r
+var X_UA = (function( n, undefined ){\r
        var acme = {},\r
                dua  = n.userAgent,\r
                dav  = n.appVersion,\r
                tv   = parseFloat(dav),\r
-               i, j, v;\r
+               tridentToVer, i, j, v;\r
                \r
        console.log( ' userAgent  : ' + dua );\r
        console.log( '-' );\r
@@ -39,11 +39,18 @@ X.UA = (function( n, undefined ){
        // Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko\r
        if( document.all || dav.indexOf( 'Trident/' ) !== -1 ){\r
                acme.ActiveX  = !!window[ 'ActiveXObject' ];\r
-               acme.IE       = document.documentMode || parseFloat(dua.split('MSIE ')[1]) || parseFloat(dua.split('rv:')[1]) || parseFloat(dav.split('MSIE ')[1]) || 0;\r
+               acme._IE      = parseFloat(dua.split('MSIE ')[1]) || parseFloat(dua.split('rv:')[1]) || parseFloat(dav.split('MSIE ')[1]) || 0;\r
+               // IE11 の互換モードの dav にも Trident/7.0 が書かれているため互換モードか?判定ができる\r
+               // 互換モードでは Silverlight でエラーが出る?\r
+               acme.Trident  = parseFloat(dav.split('Trident/')[1]) || 0;\r
+               acme.IE       = document.documentMode || acme._IE;\r
+               tridentToVer  = acme.Trident ? ( acme.Trident + 4 | 0 ) : acme._IE;\r
+               acme.IECompat = /* acme.IE !== acme._IE || */ tridentToVer !== acme._IE && tridentToVer;\r
                acme.IE4      = acme.IE && acme.IE < 5;\r
                acme.IE5678   = 5 <= acme.IE && acme.IE < 9;\r
                acme.IE5      = 5 <= acme.IE && acme.IE < 5.5;\r
                acme.IE55     = 5.5 <= acme.IE && acme.IE < 6;\r
+               acme.IE5x     = acme.IE5 || acme.IE55;\r
                acme.IE6      = 6 <= acme.IE && acme.IE < 7;\r
                acme.IE7      = 7 <= acme.IE && acme.IE < 8;\r
                acme.IE8      = 8 <= acme.IE && acme.IE < 9;\r
@@ -230,14 +237,52 @@ X.UA = (function( n, undefined ){
                dua.indexOf( 'EBRD' ) !== -1;   \r
        \r
        return acme;\r
-})( navigator );\r
+})( navigator ),\r
+\r
+X_UA_DOM   = {},\r
+X_UA_EVENT = {},\r
+X_UA_HID   = {};\r
+X_UA.IECompat && alert( X_UA.IE + ' ' + X_UA._IE + ' Tri:' + X_UA.Trident );\r
 \r
-//alert(X.UA.Safari + ' ' + X.UA.WebKit + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );\r
+/*\r
+ * http://d.hatena.ne.jp/t-uchima/20051003/p1\r
+ * MacIEにはattachEventが一応あるけどwindow.attachEventとdocument.attachEventしかなく他の要素にはattachEventはない。\r
+ */\r
+\r
+if( X_UA.IE4 && X_UA.IE < 5 ){ // ie4 & iemobi4 & macie4.x\r
+       X_UA_DOM.IE4   = true;\r
+       X_UA_EVENT.IE4 = true;\r
+} else\r
+if( X_UA.MacIE ){\r
+       X_UA_DOM.W3C  = true;\r
+       X_UA_EVENT.IE = true;\r
+} else\r
+if( document.getElementById ){\r
+       X_UA_DOM.W3C = true;\r
+       if( document.addEventListener ){\r
+               X_UA_EVENT.W3C = true;\r
+       } else\r
+       if( document.attachEvent ){\r
+               X_UA_EVENT.IE = true;\r
+       } else {\r
+               X_UA_EVENT.DOM0 = true;\r
+       };\r
+} else\r
+if( document.layers ){\r
+       \r
+} else {\r
+       \r
+};\r
+\r
+if( navigator.msPointerEnabled || navigator.pointerEnabled ) X_UA_HID.POINTER = true;\r
+if( !X_UA_HID.POINTER && window.ontouchstart !== undefined ) X_UA_HID.TOUCH   = true;\r
+\r
+//alert(X_UA.Safari + ' ' + X_UA.WebKit + '\n\n' + navigator.userAgent + '\n\n' + navigator.appVersion + '\n\n' + navigator.platform );\r
 \r
 // Safari 3.1 未満は開発コンソールがない!\r
 // http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html\r
 /*\r
-if( X.UA.Safari && X.UA.WebKit < 525.13 ){     \r
+if( X_UA.Safari && X_UA.WebKit < 525.13 ){     \r
        window.onerror = function( x, y, z ){\r
                var n = String.fromCharCode( 10 );\r
            alert('window.onerrorによるエラーの捕捉:' + n + x + n + y + 'の' + z + '行目付近です。');\r
@@ -245,20 +290,21 @@ if( X.UA.Safari && X.UA.WebKit < 525.13 ){
        };\r
 };*/\r
 \r
-if( X.UA.IE < 7 ){ // error @ NN7.2\r
+// ------------------------------------------------------------------------- //\r
+// --- interface ----------------------------------------------------------- //\r
+// ------------------------------------------------------------------------- //\r
+X.UA = X_UA;\r
+\r
+\r
+\r
+if( X_UA.IE < 7 ){ // error @ NN7.2\r
        // bonus: hotfix for IE6 SP1 (bug KB823727)\r
-       // multipleIEs IE6 standalone 版では不可\r
-       document.execCommand && document.execCommand( 'BackgroundImageCache', false, true );\r
+       // multipleIEs IE6 standalone 版では不可, IE5.5 は可,,,\r
+       X_UA.IE4 || X.UA.MacIE ?\r
+               document.execCommand && document.execCommand( 'BackgroundImageCache', false, true ) :\r
+               (function(){\r
+                       X_UA.IE_EXECOM_ERROR = eval( 'var a=1;try{document.execCommand&&document.execCommand("BackgroundImageCache",!1,!0)}catch(e){a=0}!a' );\r
+               })();\r
+       \r
+       X_UA.IE_EXECOM_ERROR && alert( 'document.execCommand error!' );\r
 };\r
-\r
-X.inObject = X.UA.IE < 5.5 ? // TODO JScript で判定\r
-       (function( name, obj ){\r
-               var p;\r
-               if( obj[ name ] ) return true;\r
-               name += ''; // 数値も許可\r
-               for( p in obj ){\r
-                       if( p === name ) return true;\r
-               };\r
-               return false;\r
-       }) :\r
-       new Function( 'a,b', 'return a in b' );// なぜか ie5 でもerror\r