OSDN Git Service

Version 0.6.171, fix X.KB & fix X.Node for SVG & VML.
authoritozyun <itozyun@user.sourceforge.jp>
Wed, 26 Aug 2015 14:34:47 +0000 (23:34 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Wed, 26 Aug 2015 14:34:47 +0000 (23:34 +0900)
0.6.x/js/02_dom/02_XNodeFlags.js
0.6.x/js/02_dom/05_XNodeAttr.js
0.6.x/js/02_dom/20_XNode.js
0.6.x/js/11_hid/01_KB.js

index 2b69e35..ff3ac0f 100644 (file)
@@ -38,9 +38,25 @@ var X_NodeFlags_DESTROYED              = 0x0,
        X_NodeFlags_IE4_HAS_ELEMENT        = X_UA[ 'IE4' ] ? 2 << 22 : 0,\r
        X_NodeFlags_IE4_DIRTY_CHILDREN     = X_UA[ 'IE4' ] ? 2 << 23 : 0,\r
        X_NodeFlags_IE4_FIXED              = X_UA[ 'IE4' ] ? 2 << 24 : 0,\r
-               \r
+\r
        X_NodeFlags_IE5_DISPLAY_NONE_FIX   = X_UA[ 'IE5' ] && X_UA[ 'ActiveX' ] ? 2 << 24 : 0,\r
 \r
+       // http://modernizr.com/downloads/modernizr.js\r
+       // Thanks to Erik Dahlstrom\r
+       X_NodeFlags_IS_SVG                 = document.createElementNS && document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' ).createSVGRect ? 2 << 25 : 0,\r
+       X_NodeFlags_IS_VML                 =\r
+                       ( function(){\r
+                               if( !X_UA[ 'ActiveX' ] || X_UA[ 'IE' ] < 5 || 9 < X_UA[ 'IE' ] ) return 0;\r
+\r
+                               document.write( '<!--[if gte vml 1]><script id=vmltest>window.vml=1;<\/script><![endif]-->' );\r
+                               \r
+                               if( window[ 'vml' ] === 1 ){\r
+                                       document.getElementById( 'vmltest' ).removeNode( true );\r
+                                       return 2 << 26;\r
+                               };\r
+                               return 0;\r
+                       })(),\r
+\r
        X_Node_BITMASK_RESET_STYLE  = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ (\r
                X_NodeFlags_STYLE_IS_DISPLAY_NONE |\r
                X_NodeFlags_STYLE_IS_INVISIBLE |\r
index 2bb4817..a438590 100644 (file)
@@ -238,6 +238,16 @@ function X_Node_attr( nameOrObj /* v */ ){
 };\r
 function X_Node_Attr_setAttr( that, attrs, newAttrs, name, v ){\r
        switch( name ){\r
+               case 'ns' :\r
+               case 'NS' :\r
+                       if( v === 'svg' || v === 'SVG' ){\r
+                               that[ '_flags' ] |= XX_NodeFlags_IS_SVG;\r
+                       };\r
+                       if( v === 'vml' || v === 'VML' ){\r
+                               that[ '_flags' ] |= XX_NodeFlags_IS_VML;\r
+                       };\r
+                       return;\r
+               \r
                // case 'type' : TODO IE は input, button, object に対して type の再設定が出来ない _state が要素生成済なら不可\r
                case 'UID' :\r
                case 'tag' :\r
index 49ae640..aad360f 100644 (file)
@@ -503,17 +503,26 @@ function X_Node_createTextAt( index, text ){
  */
 function X_Node_clone( opt_clone_children ){
        var xnode, xnodes, i, l;
+       
        if( this[ '_tag' ] ){
                X_Node_newByTag = true;
                xnode = Node( this[ '_tag' ], X_Object_copy( this[ '_attrs' ] ), X_Object_copy( this[ '_css' ] ) )
                        [ 'attr' ]( { 'id' : this[ '_id' ] } )
                        [ 'className' ]( this[ '_className' ] );
+               
+               if( this[ '_flags' ] & X_NodeFlags_IS_SVG ){
+                       xnode[ '_flags' ] |= X_NodeFlags_IS_SVG;
+               };
+               if( this[ '_flags' ] & X_NodeFlags_IS_VML ){
+                       xnode[ '_flags' ] |= X_NodeFlags_IS_VML;
+               };
+               
                if( opt_clone_children && ( xnodes = this[ '_xnodes' ] ) && ( l = xnodes.length ) ){
                        for( i = 0; i < l; ++i ){
                                xnode[ 'append' ]( xnodes[ i ][ 'clone' ]( true ) );
                        };
                };
-               return xnode;           
+               return xnode;
        };
        X_Node_newByText = true;
        return Node( this[ '_text' ] );
@@ -566,6 +575,12 @@ function X_Node_append( v ){
                v[ '_xnodes' ] && X_Node_toggleInTreeFlag( v[ '_xnodes' ], true );
                X_Node_reserveUpdate();
        };
+       if( this[ '_flags' ] & X_NodeFlags_IS_SVG ){
+               v[ '_flags' ] |= X_NodeFlags_IS_SVG;
+       };
+       if( this[ '_flags' ] & X_NodeFlags_IS_VML ){
+               v[ '_flags' ] |= X_NodeFlags_IS_VML;
+       };
        return this;
 };
 
@@ -636,6 +651,12 @@ function X_Node_appendAt( start, v ){
                v[ '_xnodes' ] && X_Node_toggleInTreeFlag( v[ '_xnodes' ], true );
                X_Node_reserveUpdate();
        };
+       if( this[ '_flags' ] & X_NodeFlags_IS_SVG ){
+               v[ '_flags' ] |= X_NodeFlags_IS_SVG;
+       };
+       if( this[ '_flags' ] & X_NodeFlags_IS_VML ){
+               v[ '_flags' ] |= X_NodeFlags_IS_VML;
+       };
        return this;
 };
 
@@ -1145,8 +1166,12 @@ function X_Node_text( text ){
        return this[ '_text' ];
 };
 
-/*
+/**
  * HTML要素に対して name の関数を実行しその戻り値を返す。関数に渡す引数も任意に設定できる。
+ * @alias Node.prototype.call
+ * @param {string} [name] 要素の関数名
+ * @return {*} 
+ * @example node.call( 'focus' );
  */
 function X_Node_call( name /*, opt_args... */ ){
        var l = arguments.length - 1,
@@ -1386,7 +1411,11 @@ var X_Node__commitUpdate =
                                                                that[ '_cssText' ] ? ' style="' + that[ '_cssText' ] + '"' : '',
                                                        '>' ].join( '' ) );
                                } else {
-                                       that[ '_rawObject' ] = elm = document.createElement( that[ '_tag' ] );
+                                       if( that[ '_flags' ] & X_NodeFlags_IS_SVG ){
+                                               that[ '_rawObject' ] = elm = document.createElementNS( 'http://www.w3.org/2000/svg', that[ '_tag' ] );
+                                       } else {
+                                               that[ '_rawObject' ] = elm = document.createElement( that[ '_tag' ] );
+                                       };
                                };
                                
                                // IE には要素追加のタイミングで起こるメモリリークがありここで追加
index 584cf0a..4d46047 100644 (file)
  * \r
  */\r
 \r
-var X_KB_TABLE     = {\r
-               specials : {\r
-                       '96'   : 48,\r
-                       '97'   : 49,\r
-                       '98'   : 50,\r
-                       '99'   : 51,\r
-                       '100'  : 52,\r
-                       '101'  : 53,\r
-                       '102'  : 54,\r
-                       '103'  : 55,\r
-                       '104'  : 56,\r
-                       '105'  : 57,\r
+var X_KB_SPECIALS = {\r
 \r
-                       '8'    : 'BS',\r
-                       '9'    : 'TAB',\r
-                       '13'   : 'ENTER',\r
-                       '16'   : 'SHIFT',\r
-                       '17'   : 'CTRL',\r
-                       '18'   : 'ALT',\r
-                       '19'   : 'PAUSE_BREAK',\r
-                       '20'   : 'SHIFT+CAPS_LOCK',\r
-                       \r
-                       '27'   : 'ESC',\r
-                       '28'   : 'trans',\r
-                       '29'   : 'no trans',\r
-                       \r
-                       '33'  : 'PAGE_UP',\r
-                       '34'  : 'PAGE_DOWN',\r
-                       '35'  : 'END',\r
-                       '36'  : 'HOME', \r
-                       '37'  : 'CSR_L',\r
-                       '38'  : 'CSR_U',\r
-                       '39'  : 'CSR_R',\r
-                       '40'  : 'CSR_D',\r
-                       '45'  : 'INS',\r
-                       '44'  : 'PRT_SCRN',\r
-                       '46'  : 'DEL',\r
-                       \r
-                       '91'  : 'LWIN',\r
-                       '92'  : 'RWIN',\r
-                       '93'  : 'APP',\r
-                       \r
-                       '106' : 42,\r
-                       '107' : 43,\r
-                       '109' : 45,\r
-                       '111' : 47,\r
-                       '112' : 'F1',\r
-                       '113' : 'F2',\r
-                       '114' : 'F3',\r
-                       '115' : 'F4',\r
-                       '116' : 'F5',\r
-                       '117' : 'F6',\r
-                       '118' : 'F7',\r
-                       '119' : 'F8',\r
-                       '120' : 'F9',\r
-                       '121' : 'F10',\r
-                       '122' : 'F11',\r
-                       '123' : 'F12',\r
-\r
-                       '144' : 'NUM_LOCK',\r
-                       '145' : 'SCROLL_LOCK',\r
-                       '208' : 'CAPS_LOCK',\r
-                       '240' : 'CAPS_LOCK',\r
-                       '242' : 'K/H',\r
-                       '243' : 'H/Z',\r
-                       '244' : 'H/Z'\r
-                       \r
-               },\r
-       // keypress 時に keyCode を直す 0 の場合、イベント発火せず。どのキーが押されたか?判定できないため\r
-               'keypress' : {\r
-                       // !-):33-41, *:42, +:43, ,:44, -:45, .:46, /:47, 0-9:48-57 , ::58 , ;:59 , <:60 , =:61, >:62, ?:63, @:64\r
-                       // A-Z:65-90, [:91, \:92, ]:93, ^:94, _:95, `:96, a-z:97-122, {:123, |:124, }:125, ~:126\r
-               },\r
+       \r
+               '8'   : 'BS',\r
+               '9'   : 'TAB',\r
+               '13'  : 'ENTER',\r
+               '16'  : 'SHIFT',\r
+               '17'  : 'CTRL',\r
+               '18'  : 'ALT',\r
+               '19'  : 'PAUSE_BREAK',\r
+               '20'  : 'SHIFT+CAPS_LOCK',\r
                \r
-               'keyup' : {\r
-                       '189' : '45,61', // ie, safari\r
-                       '109' : '45,61', // firefox, opera\r
-                       \r
-                       '222' : '94,126', // firefox, ie, safari\r
-                       '94'  : '94,126', // opera\r
+               '27'  : 'ESC',\r
+               '28'  : 'trans',\r
+               '29'  : 'no trans',\r
 \r
-                       '226' : '92,95', // firefox, ie, safari,\r
-                       '220' : 9.5 <= X_UA[ 'Opera' ] ? '92,95,124' : '92,124', // firefox, ie, safari, opera9.50+\r
-                       '92'  : '92,95,124', // opera9.25\r
-                       \r
-                       '192' : '64,96', // firefox, ie, safari\r
-                       '64'  : '64,96', // opera\r
-                       \r
-                       '219' : '91,123', // firefox, ie, safari, opera9.50+\r
-                       '91'  : '91,123', // opera9.25\r
-                       \r
-                       '187' : '59,43', // ie, safari\r
-                       '61'  : '59,43', // firefox, opera\r
-                       \r
-                       '186' : '58,42', // ie, safari\r
-                       '59'  : '58,42', // firefox, opera\r
-                       \r
-                       '221' : '93,125', // firefox, ie, safari, opera9.50+\r
-                       '93'  : '93,125', // opera9.25\r
-                       \r
-                       '188' : '44,60', // firefox, ie, safari, opera9.50+\r
-                       '44'  : '44,60', // opera9.25\r
-                       \r
-                       '190' : '46,62', // firefox, ie, safari, opera9.50+\r
-                       '46'  : '46,62', // opera9.25\r
-                       \r
-                       '191' : '47,63', // firefox, ie, safari, opera9.50+\r
-                       '47'  : '47,63' // opera9.25\r
-               }\r
+               '33'  : 'PAGE_UP',\r
+               '34'  : 'PAGE_DOWN',\r
+               '35'  : 'END',\r
+               '36'  : 'HOME', \r
+               '37'  : 'CSR_L',\r
+               '38'  : 'CSR_U',\r
+               '39'  : 'CSR_R',\r
+               '40'  : 'CSR_D',\r
+               '44'  : 'PRT_SCRN',             \r
+               '45'  : 'INS',\r
+               '46'  : 'DEL',\r
+               \r
+               '91'  : 'LWIN',\r
+               '92'  : 'RWIN',\r
+               '93'  : 'APP',\r
+               \r
+               '96'  : 48,\r
+               '97'  : 49,\r
+               '98'  : 50,\r
+               '99'  : 51,\r
+               '100' : 52,\r
+               '101' : 53,\r
+               '102' : 54,\r
+               '103' : 55,\r
+               '104' : 56,\r
+               '105' : 57,\r
+               '106' : 42,\r
+               '107' : 43,\r
+               '109' : 45,\r
+               '111' : 47,\r
+               '112' : 'F1',\r
+               '113' : 'F2',\r
+               '114' : 'F3',\r
+               '115' : 'F4',\r
+               '116' : 'F5',\r
+               '117' : 'F6',\r
+               '118' : 'F7',\r
+               '119' : 'F8',\r
+               '120' : 'F9',\r
+               '121' : 'F10',\r
+               '122' : 'F11',\r
+               '123' : 'F12',\r
+       \r
+               '144' : 'NUM_LOCK',\r
+               '145' : 'SCROLL_LOCK',\r
+               '208' : 'CAPS_LOCK',\r
+               '240' : 'CAPS_LOCK',\r
+               '242' : 'K/H',\r
+               '243' : 'H/Z',\r
+               '244' : 'H/Z'\r
        },\r
        X_KB_DOWN_KEYS   = {},\r
        X_KB_CANCELED    = {},\r
-       X_KB_lastIs10Key = 0,\r
+       X_KB_lastIs10Key = false,\r
        X_KB_lastKeyCode = 0, \r
        X_KB_TRANSFOEM   = {},\r
        \r
@@ -148,17 +105,16 @@ var X_KB_TABLE     = {
                                        \r
                                        switch( e.type ){\r
                                                case 'keydown' :\r
-\r
                                                        if( X_KB_DOWN_KEYS[ keyCode ] ){\r
                                                                // 既に押されている、メタキー[shift,ctrl,alt]の変化はある?\r
-                                                               return cb;\r
+                                                               return X_KB_CANCELED[ keyCode ] ? X_CALLBACK_PREVENT_DEFAULT : cb;\r
                                                        } else\r
-                                                       if( special = X_KB_TABLE.specials[ keyCode ] ){\r
+                                                       if( special = X_KB_SPECIALS[ keyCode ] ){\r
                                                                \r
                                                                if( X_Type_isNumber( special ) ){\r
                                                                        // テンキーの [0]~[9]\r
                                                                        //chrCode = special;\r
-                                                                       X_KB_lastKeyCode  = keyCode;\r
+                                                                       X_KB_lastKeyCode = keyCode;\r
                                                                        X_KB_lastIs10Key = true;\r
                                                                        return cb;\r
                                                                } else {\r
@@ -181,20 +137,27 @@ var X_KB_TABLE     = {
                                                                if( cb & X_CALLBACK_PREVENT_DEFAULT ){\r
                                                                        X_KB_CANCELED[ keyCode ] = true;\r
                                                                };\r
+                                                               /*\r
+                                                               if( special === 'APP' ){\r
+                                                                       X_ViewPort_active = false;\r
+                                                                       X_ViewPort[ 'dispatch' ]( X_EVENT_VIEW_DEACTIVATE );\r
+                                                               }; */\r
                                                        } else {\r
                                                                X_KB_lastKeyCode = keyCode;\r
-                                                       };\r
-\r
+                                                       };      \r
                                                        return cb;\r
                                                        \r
                                                case 'keypress' :\r
                                                        // keydown 側で発火しているものは再び発火しない\r
-                                                       console.log( 'kp : ' + X_KB_DOWN_KEYS[ chrCode ] + ( X_KB_CANCELED[ chrCode ] ? ' Cancel!' : '' ) );\r
+                                                       console.log( 'keypress : chrCode:' + chrCode + ' down:' + X_KB_DOWN_KEYS[ chrCode ] + ( X_KB_CANCELED[ chrCode ] ? ' Cancel!' : '' ) );\r
                                                        if( X_KB_DOWN_KEYS[ chrCode ] ){\r
                                                                return X_KB_CANCELED[ chrCode ] ? X_CALLBACK_PREVENT_DEFAULT : cb;\r
+                                                       } else\r
+                                                       if( keyCode === 32 ){\r
+                                                               charCode = 32;\r
                                                        };\r
 \r
-                                                       if( 33 <= chrCode && chrCode <= 126 ){\r
+                                                       if( 32 <= chrCode && chrCode <= 126 ){\r
                                                                X_KB_TRANSFOEM[ X_KB_lastKeyCode ] = chrCode;\r
                                                                \r
                                                                cb = this[ 'dispatch' ]( {\r
@@ -217,7 +180,7 @@ var X_KB_TABLE     = {
                                                                cb = X_CALLBACK_PREVENT_DEFAULT;\r
                                                        };\r
                                                \r
-                                                       if( ( special = X_KB_TABLE.specials[ keyCode ] ) && ( !X_KB_DOWN_KEYS[ keyCode ] && !X_KB_DOWN_KEYS[ special ] ) ){\r
+                                                       if( ( special = X_KB_SPECIALS[ keyCode ] ) && ( !X_KB_DOWN_KEYS[ keyCode ] && !X_KB_DOWN_KEYS[ special ] ) ){\r
                                                                cb |= this[ 'dispatch' ]( {\r
                                                                        type      : 'keydown',\r
                                                                        keyCode   : keyCode,\r
@@ -237,10 +200,10 @@ var X_KB_TABLE     = {
                                                        \r
                                                        chrCode = 0;\r
                                                        if( !special ){\r
+                                                               // keyCode から charCode を復帰する\r
                                                                chrCode = X_KB_TRANSFOEM[ keyCode ];\r
                                                                if( !chrCode ) return cb;\r
                                                                delete X_KB_TRANSFOEM[ keyCode ];\r
-                                                               //keyCode = 0;\r
                                                        };\r
                                                \r
                                                        cb |= this[ 'dispatch' ]( {\r