*/
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' ] );
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;
};
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;
};
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,
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 には要素追加のタイミングで起こるメモリリークがありここで追加
* \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
\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
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
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
\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