X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F02_dom%2F20_XNode.js;h=ca2882128555fedd8a2734ddcf7a73aad780c35b;hb=b28fd52ddc41a1c927f92fa7eeeb6891c41e55d9;hp=b775d71b746e71537b42ef4de9264a4510bc2d4d;hpb=527f50d3e1930a335a6525b5c973ab27fe385868;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/02_dom/20_XNode.js b/0.6.x/js/02_dom/20_XNode.js index b775d71..ca28821 100644 --- a/0.6.x/js/02_dom/20_XNode.js +++ b/0.6.x/js/02_dom/20_XNode.js @@ -9,7 +9,6 @@ var Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ]( 'X.Node', X_Class.POOL_OBJECT, - { /** * 要素に振られるユニークID @@ -562,7 +561,7 @@ function X_Node_append( v ){ // 親の xnodes から v を消す v.parent && v[ 'remove' ](); // IE4 でテキストノードの追加、FIXED 済でない場合、親に要素の追加を通知 - if( X_UA[ 'IE4' ] && !v[ '_tag' ] && ( this[ '_flags' ] & X_NodeFlags_IE4_FIXED ) === 0 ) this[ '_flags' ] |= X_NodeFlags_IE4_DIRTY_CHILDREN; + if( X_UA[ 'IE4' ] && !v[ '_tag' ] && ( ( this[ '_flags' ] & X_NodeFlags_IE4_FIXED ) === 0 ) ) this[ '_flags' ] |= X_NodeFlags_IE4_DIRTY_CHILDREN; break; default : return this; @@ -638,7 +637,7 @@ function X_Node_appendAt( start, v ){ v[ 'remove' ](); }; // IE4 でテキストノードの追加、FIXED 済でない場合、親に要素の追加を通知 - if( X_UA[ 'IE4' ] && !v[ '_tag' ] && ( this[ '_flags' ] & X_NodeFlags_IE4_FIXED ) === 0 ) this[ '_flags' ] |= X_NodeFlags_IE4_DIRTY_CHILDREN; + if( X_UA[ 'IE4' ] && !v[ '_tag' ] && ( ( this[ '_flags' ] & X_NodeFlags_IE4_FIXED ) === 0 ) ) this[ '_flags' ] |= X_NodeFlags_IE4_DIRTY_CHILDREN; break; default : return this; @@ -768,10 +767,11 @@ function X_Node_swap( v ){ }; /** - * 要素を抜く。 + * 要素を親要素から抜く。jQuery の remove と異なり、インスタンスは破壊(kill)されず、再び別の親に挿入等できる * @alias Node.prototype.remove * @return {Node} 自身。チェインメソッド * @example node.remove(); + * parent.append( node ); 新しい親に追加できる */ function X_Node_remove(){ var parent = this.parent, @@ -791,7 +791,7 @@ function X_Node_remove(){ X_Node_reserveRemoval[ X_Node_reserveRemoval.length ] = this; X_Node_reserveUpdate(); } else - if( !this[ '_tag' ] && ( parent[ '_flags' ] & X_NodeFlags_IE4_FIXED ) === 0 ){ + if( !this[ '_tag' ] && ( ( parent[ '_flags' ] & X_NodeFlags_IE4_FIXED ) === 0 ) ){ parent[ '_flags' ] |= X_NodeFlags_IE4_DIRTY_CHILDREN; }; } else { @@ -821,7 +821,9 @@ function X_Node_remove(){ */ function X_Node_empty(){ var xnodes = this[ '_xnodes' ], i; + if( xnodes && ( i = xnodes.length ) ){ + delete this[ '_xnodes' ]; for( ; i; ){ xnodes[ --i ][ 'kill' ](); }; @@ -836,31 +838,33 @@ function X_Node_onKill( that ){ if( ( that[ '_flags' ] & X_NodeFlags_EXIST ) === 0 ) return; - parent && parent[ '_xnodes' ].splice( parent[ '_xnodes' ].indexOf( that ), 1 ); + parent && parent[ '_xnodes' ] && parent[ '_xnodes' ].splice( parent[ '_xnodes' ].indexOf( that ), 1 ); elm = that[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( that ); - // elm && that[ '_listeners' ] && X_EventDispatcher_unlistenAll( that ); // イベントの退避 if( xnodes && ( i = xnodes.length ) ){ + delete that[ '_xnodes' ]; for( ; i; ){ xnodes[ --i ][ 'kill' ](); }; + xnodes.length = 0; }; - delete X_Node_CHASHE[ that[ '_uid' ] ]; + X_Node_CHASHE[ that[ '_uid' ] ] = null; // array に対して delete X_Node_CHASHE[ uid ] はまずい! + // remove _xnodes if( X_UA_DOM.IE4 ){ if( elm ){ X_Node_reserveRemoval[ X_Node_reserveRemoval.length ] = elm; X_Node_reserveUpdate(); } else - if( !that[ '_tag' ] && ( parent[ '_flags' ] & X_NodeFlags_IE4_FIXED ) === 0 ){ + if( !that[ '_tag' ] && ( ( parent[ '_flags' ] & X_NodeFlags_IE4_FIXED ) === 0 ) ){ parent[ '_flags' ] |= X_NodeFlags_IE4_DIRTY_CHILDREN; }; } else { if( elm && elm.parentNode && elm.parentNode.tagName ){ X_Node_reserveRemoval[ X_Node_reserveRemoval.length ] = elm; - X_Node_reserveUpdate(); + X_Node_reserveUpdate(); }; }; }; @@ -1095,7 +1099,12 @@ function X_Node_html( html ){ // setter if( html !== undefined ){ // String 以外に Number や false null なども許可 if( !this[ '_tag' ] ) return this[ 'text' ]( html ); - return html ? this[ 'empty' ]()[ 'append' ].apply( this, X_HtmlParser_parse( html, true ) ) : this[ 'empty' ](); + + this[ 'empty' ](); + if( html ){ + X_Node_append.apply( this, X_HtmlParser_parse( html, true ) ); + }; + return this; }; // getter @@ -1452,7 +1461,7 @@ var X_Node__commitUpdate = accumulatedFlags |= that[ '_flags' ]; if( that[ '_flags' ] & X_NodeFlags_IE5_DISPLAY_NONE_FIX ){ - if( accumulatedFlags & ( X_NodeFlags_DIRTY_POSITION | X_NodeFlags_DIRTY_ID | X_NodeFlags_DIRTY_CLASSNAME ) === 0 ){ + if( ( accumulatedFlags & ( X_NodeFlags_DIRTY_POSITION | X_NodeFlags_DIRTY_ID | X_NodeFlags_DIRTY_CLASSNAME ) ) === 0 ){ return nextElement; }; }; @@ -1481,6 +1490,8 @@ var X_Node__commitUpdate = } else if( that[ '_flags' ] & X_NodeFlags_IS_SVG ){ elm = document.createElementNS( 'http://www.w3.org/2000/svg', that[ '_tag' ].toLowerCase() ); + + // math http://www.w3.org/1998/Math/MathML } else { elm = document.createElement( that[ '_tag' ] ); }; @@ -1534,7 +1545,7 @@ var X_Node__commitUpdate = parentElement.appendChild( elm ); }; - if( that[ '_listeners' ] && ( that[ '_flags' ] & X_NodeFlags_ACTUAL_LISTENING ) === 0 ){ + if( that[ '_listeners' ] && ( ( that[ '_flags' ] & X_NodeFlags_ACTUAL_LISTENING ) === 0 ) ){ X_EventDispatcher_toggleAllEvents( that, true );// イベントの退避 that[ '_flags' ] |= X_NodeFlags_ACTUAL_LISTENING; };