var \r
\r
X_Node_State = {\r
- DESTROYED : 0,\r
- EXIST : 1,\r
- IN_TREE : 2,\r
+ DESTROYED : 0x0,\r
+ EXIST : 0x1,\r
+ IN_TREE : 0x2, // xnode が(仮想)ツリーに追加されている -> 描画の対象\r
\r
- ELM_EXIST : 2 << 1,\r
- ELM_IN_TREE : 2 << 2,\r
+ ELM_NEED_INIT : 2 << 1,\r
\r
- STYLE_IS_DISPLAY_NONE : 2 << 4, // display:none \r
- STYLE_IS_HIDDEN : 2 << 5, // visibility:hidden opacity:0\r
- STYLE_IS_POS_ABSOLUTE : 2 << 6, // position:absolute\r
- STYLE_IS_NO_OVERFLOW : 2 << 7, // overflow:hidden\r
- STYLE_IS_WIDTH_LENGTH : 2 << 8, // width : width() のための commitUpdate が不要\r
- STYLE_IS_WIDTH_PCT : 2 << 9, // width : width() のための commitUpdate が不要かもしれない。(親で LENGTH が指定されているなら)\r
- STYLE_IS_HEIGHT_LENGTH : 2 << 10, // height :\r
- STYLE_IS_HEIGHT_PCT : 2 << 11, // height :\r
- STYLE_IS_FONT_LENGTH : 2 << 12, // fontSize :\r
- STYLE_IS_FONT_PCT : 2 << 13, // fontSize :\r
+ STYLE_IS_DISPLAY_NONE : 2 << 2, // display : none \r
+ STYLE_IS_INVISIBLE : 2 << 3, // visibility : hidden or opacity : 0\r
+ STYLE_IS_POS_ABSOLUTE : 2 << 4, // position : absolute\r
+ STYLE_IS_NO_OVERFLOW : 2 << 5, // overflow : hidden\r
+ STYLE_IS_WIDTH_LENGTH : 2 << 6, // width : width() のための commitUpdate が不要\r
+ STYLE_IS_WIDTH_PCT : 2 << 7, // width : width() のための commitUpdate が不要かもしれない。(親で LENGTH が指定されているなら)\r
+ STYLE_IS_HEIGHT_LENGTH : 2 << 8, // height :\r
+ STYLE_IS_HEIGHT_PCT : 2 << 9, // height :\r
+ STYLE_IS_FONT_LENGTH : 2 << 10, // fontSize :\r
+ STYLE_IS_FONT_PCT : 2 << 11, // fontSize :\r
+\r
+ //DIRTY_CHILD : 2 << 18, // 使っていない\r
+ DIRTY_CONTENT : 2 << 12, // width, height, x, y textNode の内容 TODO html と排他なので ID と共通でいい\r
+ DIRTY_ID : 2 << 13, // width, height, x, y\r
+ DIRTY_CLASSNAME : 2 << 14, // X_Node_CSS_getCharSize, width, height, x, y\r
+ DIRTY_ATTR : 2 << 15, // X_Node_CSS_getCharSize, width, height, x, y\r
+ DIRTY_CSS : 2 << 16, // X_Node_CSS_getCharSize, width, height, x, y\r
+ DIRTY_IE_FILTER : X_UA.IE < 10 && X_UA.ActiveX ? 2 << 17 : 0, // \r
+\r
+ OLD_ATTRTEXT : 2 << 18,\r
+ OLD_CSSTEXT : 2 << 19,\r
+\r
+ GPU_WAITING : 2 << 20, // 1:子のGPU解除待\r
+ GPU_RESERVED : 2 << 21, // 2:GPU予約\r
+ GPU_NOW : 2 << 20 | 2 << 21, // 3:GPU now!()\r
+ GPU_RELEASE_RESERVED : 2 << 20 | 2 << 21 | 2 << 22, // 4:GPU解除予約\r
\r
- IE4_ONLY_TEXT : 2 << 14,\r
- IE5_DISPLAY_NONE_FIX : X_UA.IE5 && X_UA.ActiveX ? 2 << 15 : 0, // filterがかかっていると不可ってことかも? MacIE5.2- は ?\r
- UNKNOWN_TAG_FIX : 2 << 16, // 使っていない\r
- IE4_TEXTNODE_FIX : 2 << 17,\r
- \r
- DIRTY_CHILD : 2 << 18, // 使っていない\r
- DIRTY_CONTENT : 2 << 19, // width, height, x, y textNode の内容\r
- DIRTY_ID : 2 << 20, // width, height, x, y\r
- DIRTY_CLASSNAME : 2 << 21, // X_Node_CSS_getCharSize, width, height, x, y\r
- DIRTY_ATTR : 2 << 22, // X_Node_CSS_getCharSize, width, height, x, y\r
- DIRTY_CSS : 2 << 23, // X_Node_CSS_getCharSize, width, height, x, y\r
- DIRTY_IE_FILTER : X_UA.IE < 10 && X_UA.ActiveX ? 2 << 24 : 0, // \r
- \r
- GPU_WAITING : 2 << 25, // 1:子のGPU解除待\r
- GPU_RESERVED : 2 << 26, // 2:GPU予約\r
- GPU_NOW : 2 << 25 | 2 << 26, // 3:GPU now!()\r
- GPU_RELEASE_RESERVED : 2 << 27 // 4:GPU解除予約\r
+ /* 子要素は一つのテキストノード */\r
+ IE4_ONLY_TEXT : 2 << 23,\r
+ /* 子要素に html要素とテキストノードが混在する */\r
+ IE4_TEXTNODE_FIX : 2 << 24,\r
+ IE4_TEXTNODE_EXIST : 2 << 25\r
},\r
\r
- X_Node_DIRTY_MASK = \r
+ X_Node_BITMASK_RESET_STYLE = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ (\r
+ X_Node_State.STYLE_IS_DISPLAY_NONE |\r
+ X_Node_State.STYLE_IS_INVISIBLE |\r
+ X_Node_State.STYLE_IS_POS_ABSOLUTE |\r
+ X_Node_State.STYLE_IS_NO_OVERFLOW |\r
+ X_Node_State.STYLE_IS_WIDTH_LENGTH |\r
+ X_Node_State.STYLE_IS_WIDTH_PCT |\r
+ X_Node_State.STYLE_IS_HEIGHT_LENGTH |\r
+ X_Node_State.STYLE_IS_HEIGHT_PCT |\r
+ X_Node_State.STYLE_IS_FONT_LENGTH |\r
+ X_Node_State.STYLE_IS_FONT_PCT ),\r
+\r
+ X_Node_BitMask_IS_DIRTY = \r
X_Node_State.DIRTY_CHILD | X_Node_State.DIRTY_CONTENT | X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME |\r
X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_CSS | X_Node_State.DIRTY_IE_FILTER,\r
\r
- X_Node_DIRTY_MASK_RESET = ( ( 2 << 29 ) - 1 ) ^ X_Node_DIRTY_MASK,\r
+ X_Node_BitMask_RESET_DIRTY = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ X_Node_BitMask_IS_DIRTY,\r
\r
X_Node_TYPE = {\r
XNODE : 1,\r
\r
X_Node_useDocumentFragment = document.createDocumentFragment && ( !X_UA.IE || 5.5 <= X_UA.IE ) && document.createDocumentFragment(),\r
\r
+ X_Node_displayNoneFixForIE5 = X_UA.IE5 && X_UA.ActiveX,\r
+ \r
X_Node_newByTag = false,\r
\r
X_Node_newByText = false,\r
{\r
_uid : 0,\r
_flags : X_Node_State.DESTROYED,\r
- \r
- _isNew : false, // state にまとめる\r
- _root : null, // xnode が文書ツリーに属しているか?はこれを見る -> state \r
- _xnodeType : 0, // state へ\r
- \r
+\r
_rawObject : null,\r
_rect : null, // \r
+ _fontSize : 0,\r
\r
parent : null, // remove された枝も親子構造は維持している。\r
_xnodes : null, // Array.<Node>\r
\r
_tag : '',\r
- _text : null,\r
- _id : null,\r
+ _text : '',\r
+ _id : '',\r
_className : '',\r
\r
_attrs : null, // see X_Node_Attr\r
_newAttrs : null,\r
- _attrText : '', // X_Node_Attr_objToAttrText が必要な場合は false が入っている\r
+ _attrText : '',\r
\r
_css : null, // see X_Node_CSS\r
- _cssText : null, // String | null\r
- \r
- _fontSize : 0,\r
+ _cssText : '',\r
\r
_anime : null, // Hash see X_Node_Anime\r
\r
if( X_Node_newByTag ){\r
X_Node_newByTag = false;\r
this._tag = v.toUpperCase();\r
- this._flags |= X_Node_State.EXIST;\r
+ this._flags |= X_Node_State.EXIST;\r
arguments[ 1 ] && this.attr( arguments[ 1 ] );\r
css = arguments[ 2 ];\r
css && this[ X.Type.isString( css ) ? 'cssText' : 'css' ]( css );\r
if( X_Node_newByText ){\r
X_Node_newByText = false;\r
this._text = v;\r
- this._flags |= X_Node_State.EXIST;\r
+ this._flags |= X_Node_State.EXIST;\r
} else {\r
if( 1 < arguments.length ) return new X_NodeList( arguments );\r
if( X.Type.isArray( v ) && v.length ) return new X_NodeList( v );\r
if( xnode = X_Node_getXNode( v ) ) return xnode;\r
// v.parentNode || v.parentElement : dom1 || dom0\r
this.parent = ( parent = v.parentNode || v.parentElement ) && parent.tagName /* ie7- */ && X_Node_getXNode( parent );\r
- if( this.parent && this.parent._root ){\r
- this._root = this.parent._root;\r
- this._flags |= X_Node_State.IN_TREE | X_Node_State.ELM_IN_TREE;\r
+ if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){\r
+ this._flags |= X_Node_State.IN_TREE;\r
};\r
this._rawObject = v;\r
- this._flags |= X_Node_State.EXIST | X_Node_State.ELM_EXIST;\r
+ this._flags |= X_Node_State.EXIST;\r
this._tag = v.tagName.toUpperCase();\r
this._id = v.id;\r
this._className = v.className;\r
+ \r
this.cssText( v.style.cssText );\r
- // X_Node_State.DIRTY_CSS を落とす\r
- //this._flags = 0;\r
- this._flags &= X_Node_DIRTY_MASK_RESET;\r
+ this._flags &= X_Node_BitMask_RESET_DIRTY; // X_Node_State.DIRTY_CSS を落とす\r
+ \r
// TODO attr の回収は不可能、、、\r
if( X_UA_DOM.IE4 ){\r
v.setAttribute( 'UID', '' + uid );\r
case X_Node_TYPE.RAW_TEXT :\r
if( xnode = X_Node_getXNode( v ) ) return xnode;\r
this.parent = X_Node_getXNode( v.parentNode );\r
- if( this.parent && this.parent._root ) this._root = this.parent._root;\r
+ if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){\r
+ this._flags |= X_Node_State.IN_TREE;\r
+ };\r
this._rawObject = v;\r
- this._flags |= X_Node_State.EXIST;\r
+ this._flags |= X_Node_State.EXIST;\r
this._text = v.data;\r
v.UID = uid;\r
break;\r
};\r
\r
\r
+function X_Node_toggleInTreeFlag( xnodes, flag ){\r
+ var i = xnodes.length, xnode;\r
+ for( ; i; ){\r
+ xnode = xnodes[ --i ];\r
+ flag ? ( xnode._flags |= X_Node_State.IN_TREE ) : ( xnode._flags &= ~X_Node_State.IN_TREE );\r
+ xnode._xnodes && X_Node_toggleInTreeFlag( xnode._xnodes, flag );\r
+ };\r
+};\r
+\r
/* --------------------------------------\r
* Create\r
*/\r
\r
xnode.parent = this;\r
this._xnodes[ this._xnodes.length ] = xnode;\r
- this._root && X_Node_reserveUpdate();\r
+ if( this._flags & X_Node_State.IN_TREE ){\r
+ xnode._flags |= X_Node_State.IN_TREE;\r
+ xnode._xnodes && X_Node_toggleInTreeFlag( xnode._xnodes, true );\r
+ X_Node_reserveUpdate();\r
+ };\r
return xnode;\r
};\r
function X_Node_createAt( index, tag, opt_attrs, opt_css ){\r
X_Node_newByText = true;\r
xnode = new Node( text );\r
xnode.parent = this;\r
- \r
- this._root && X_Node_reserveUpdate();\r
this._xnodes[ this._xnodes.length ] = xnode;\r
+ \r
+ if( this._flags & X_Node_State.IN_TREE ){\r
+ xnode._flags |= X_Node_State.IN_TREE;\r
+ xnode._xnodes && X_Node_toggleInTreeFlag( xnode._xnodes, true );\r
+ X_Node_reserveUpdate();\r
+ };\r
return xnode;\r
};\r
function X_Node_createTextAt( index, text ){\r
\r
v.parent = this;\r
xnodes[ xnodes.length ] = v;\r
- this._root && X_Node_reserveUpdate();\r
+ if( this._flags & X_Node_State.IN_TREE ){\r
+ v._flags |= X_Node_State.IN_TREE;\r
+ v._xnodes && X_Node_toggleInTreeFlag( v._xnodes, true );\r
+ X_Node_reserveUpdate();\r
+ };\r
return this;\r
};\r
\r
\r
v.parent = this;\r
this._xnodes.splice( start, 0, v );\r
- this._root && X_Node_reserveUpdate();\r
+ if( this._flags & X_Node_State.IN_TREE ){\r
+ v._flags |= X_Node_State.IN_TREE;\r
+ v._xnodes && X_Node_toggleInTreeFlag( v._xnodes, true );\r
+ X_Node_reserveUpdate();\r
+ };\r
return this;\r
};\r
\r
\r
if( !parent ) return this;\r
\r
+ delete this.parent;\r
parent._xnodes.splice( parent._xnodes.indexOf( this ), 1 );\r
- if( this._root ){\r
+ if( this._flags & X_Node_State.IN_TREE ){\r
+ this._flags ^= X_Node_State.IN_TREE;\r
+ this._xnodes && X_Node_toggleInTreeFlag( this._xnodes, false );\r
+ \r
X_Node_reserveRemoval[ X_Node_reserveRemoval.length ] = this;\r
X_Node_reserveUpdate();\r
};\r
- delete this.parent;\r
- delete this._root;\r
return this;\r
};\r
\r
/* --------------------------------------\r
* TODO destory -> kill\r
*/\r
-// Node._destroyChildFlag = false; // TODO\r
\r
function X_Node_destroy( isChild ){\r
var xnodes = this._xnodes, i, elm;\r
delete X_Node_CHASHE[ this._uid ];\r
delete this._flags;\r
\r
- if( this._root ){\r
+ if( this._flags & X_Node_State.IN_TREE ){\r
!isChild && this.remove();\r
} else {\r
this.parent && this.parent._xnodes.splice( this.parent._xnodes.indexOf( this ), 1 );\r
};\r
};\r
\r
+function X_Node_onKill( e ){\r
+ var elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
+ \r
+ delete X_Node_CHASHE[ this._uid ];\r
+ delete this._flags;\r
+ \r
+ if( this._flags & X_Node_State.IN_TREE ){\r
+ this.remove();\r
+ } else {\r
+ this.parent && this.parent._xnodes.splice( this.parent._xnodes.indexOf( this ), 1 );\r
+ elm && X_Node__actualRemove( this );\r
+ };\r
+};\r
\r
\r
/* --------------------------------------\r
v ? ( this._className = v ) : delete this._className;\r
};\r
this._flags |= X_Node_State.DIRTY_CLASSNAME;\r
- this._root && X_Node_reserveUpdate();\r
+ this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();\r
return this;\r
};\r
function X_Node_addClass( v ){\r
return this._text;\r
};\r
\r
- if( this._flags & X_Node_State.DIRTY_CSS && !( this._cssText = X_Node_CSS_objToCssText( this ) ) ){\r
- delete this._cssText;\r
- };\r
+ this._flags & X_Node_State.OLD_CSSTEXT && X_Node_CSS_objToCssText( this );\r
+\r
html = !X_Node_outerXNode ? [] : [\r
'<', this._tag,\r
this._id ? ' id="' + this._id + q : _,\r
this._className ? ' class="' + this._className + q : _,\r
- this._attrText === false ? ( this._attrText = X_Node_Attr_objToAttrText( this._attrs ) ) : this._attrText,\r
+ this._flags & X_Node_State.OLD_ATTRTEXT ? X_Node_Attr_objToAttrText( this ) : this._attrText,\r
this._cssText ? ' style="' + this._cssText + q : _,\r
'>' ];\r
\r
html[ n ] = xnodes[ i ].html();\r
++n;\r
};\r
- if( X_Node_outerXNode === this ) X_Node_outerXNode = null;\r
+ if( X_Node_outerXNode === this ) X_Node_outerXNode = null;\r
};\r
!X_Node_outerXNode || X_Dom_DTD_EMPTY[ this._tag ] || ( html[ n ] = '<\/' + this._tag + '>' );\r
return html.join( _ );\r
if( !this._tag ){\r
if( this._text !== text ){\r
text ? ( this._text = text ) : delete this.text;\r
- this._root && X_Node_reserveUpdate();\r
- this._flags |= X_Node_State.DIRTY_CONTENT;\r
+ this._flags |= X_Node_State.DIRTY_CONTENT; \r
+ this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();\r
};\r
return this;\r
};\r
removal.length = 0;\r
};\r
\r
- if( X_Node_html._flags & X_Node_DIRTY_MASK ){\r
+ if( X_Node_html._flags & X_Node_BitMask_IS_DIRTY ){\r
X_Node__commitUpdate( X_Node_html );\r
} else {\r
X_Node__commitUpdate( X_Node_head );\r
var elm = that._rawObject,\r
xnodes, l, i, frg, next, k, v;\r
\r
- if( that._flags & X_Node_State.IE5_DISPLAY_NONE_FIX ){\r
+ if( X_Node_displayNoneFixForIE5 && that._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ){\r
// filter の効いている要素だけdisplay:none が無視される模様。filter を切ればよい?\r
// 親が、display:none の場合は?\r
elm && elm.parentNode && X_Node__actualRemove( that );\r
\r
delete that._fontSize;\r
\r
- if( that._flags & X_Node_DIRTY_MASK ){\r
+ if( that._flags & X_Node_BitMask_IS_DIRTY ){\r
X_Node__updateRawNode( that, elm );\r
} else\r
- if( X_Node_State.IE5_DISPLAY_NONE_FIX ){\r
+ if( that._tag && X_Node_displayNoneFixForIE5 && elm.currentStyle.display === 'none' ){\r
// TODO 親要素への変更で display:none が変わる場合もあるのでここで調べる\r
};\r
\r
- if( that._flags & X_Node_State.IE5_DISPLAY_NONE_FIX ){\r
+ if( X_Node_displayNoneFixForIE5 && that._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ){\r
return nextElement;\r
};\r
return elm;\r
xnodes = that._xnodes;\r
l = xnodes ? xnodes.length : 0;\r
\r
- if( that._flags & X_Node_State.IE4_TEXTNODE_FIX || ( that._flags & X_Node_State.IE4_ONLY_TEXT && ( l !== 1 || xnodes[ 0 ]._tag ) ) ){ // 1 < l && elm.children.length === 0\r
+ if( ( that._flags & X_Node_State.IE4_ONLY_TEXT && ( l !== 1 || xnodes[ 0 ]._tag ) ) || that._flags & X_Node_State.IE4_TEXTNODE_FIX ){\r
html = [];\r
for( i = 0; i < l; ++i ){\r
html[ i ] = X_Node__actualCreate( xnodes[ i ] );\r
for( i = 0; i < l; ++i ){\r
X_Node__afterActualCreate( xnodes[ i ] );\r
};\r
+ that._flags &= ~X_Node_State.IE4_TEXTNODE_FIX;\r
that._flags &= ~X_Node_State.IE4_ONLY_TEXT;\r
} else\r
- if( that._flags & X_Node_State.IE4_ONLY_TEXT ){ // textNode が swap した場合の検出は、_root で行う\r
+ // TODO textNode だけが 2つ以上ある場合\r
+ if( that._flags & X_Node_State.IE4_ONLY_TEXT ){\r
text = xnodes[ 0 ];\r
- //if( text._flags || !text._root ){\r
- if( text._flags & X_Node_State.DIRTY_CONTENT || !text._root ){\r
+ if( text._flags & X_Node_State.DIRTY_CONTENT || ( text._flags & X_Node_State.IE4_TEXTNODE_EXIST ) === 0 ){\r
elm.innerHTML = text._text;\r
- //delete text._flags;\r
- text._flags &= X_Node_DIRTY_MASK_RESET;\r
- text._root = that._root; \r
+ text._flags &= X_Node_BitMask_RESET_DIRTY;\r
+ /* if( taht._flags & X_Node_State.IN_TREE ) */ text._flags |= X_Node_State.IE4_TEXTNODE_EXIST;\r
};\r
} else\r
if( l ){\r
};\r
\r
delete that._fontSize;\r
- //that._flags && X_Node__updateRawNode( that, elm );\r
- that._flags & X_Node_DIRTY_MASK && X_Node__updateRawNode( that, elm );\r
+ that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
return elm;\r
}) :\r
(function(){});\r
// textNode\r
if( !that._tag ){\r
elm.data = X_String_chrReferanceTo( that._text );\r
- //delete that._flags;\r
- that._flags &= X_Node_DIRTY_MASK_RESET;\r
+ that._flags &= X_Node_BitMask_RESET_DIRTY;\r
return;\r
};\r
// id\r
// className\r
if( that._flags & X_Node_State.DIRTY_CLASSNAME ){\r
that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE5678 ? 'className' : 'class' ) ); // className は ie7-? \r
-\r
- // ie5 only\r
- // TODO 親へのクラス・id指定で display : none になるケースもある\r
- if( X_Node_State.IE5_DISPLAY_NONE_FIX && elm.currentStyle.display === 'none' ){\r
- X_Node__actualRemove( that );\r
- that._flags |= X_Node_State.IE5_DISPLAY_NONE_FIX;\r
- return;\r
- };\r
};\r
\r
+ // ie5 only\r
+ // TODO 親へのクラス・id指定で display : none になるケースもある\r
+ if( X_Node_displayNoneFixForIE5 && elm.currentStyle.display === 'none' ){\r
+ X_Node__actualRemove( that );\r
+ that._flags |= X_Node_State.STYLE_IS_DISPLAY_NONE;\r
+ return;\r
+ }; \r
+ \r
if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
elm.style.filter = X_Node_CSS_objToIEFilterText( that );;\r
};\r
// style\r
// TODO display:none の場合、更新をスキップ\r
if( that._flags & X_Node_State.DIRTY_CSS ){\r
- if( that._cssText !== null || ( that._cssText = X_Node_CSS_objToCssText( that ) ) ){\r
+ if( that._flags & X_Node_State.OLD_CSSTEXT ? X_Node_CSS_objToCssText( that ) : that._cssText ){\r
X_UA.Opera78 || X_UA.NN6 ?\r
elm.setAttribute( 'style', that._cssText ) : // opera8用\r
( elm.style.cssText = that._cssText );\r
};\r
};\r
\r
- //delete that._flags;\r
- that._flags &= X_Node_DIRTY_MASK_RESET;\r
+ that._flags &= X_Node_BitMask_RESET_DIRTY;\r
}) :\r
X_UA_DOM.IE4 ? \r
( function( that, elm ){\r
// fake textNode\r
if( !that._tag ){\r
elm.innerText = that._text;\r
- //delete that._flags;\r
- that._flags &= X_Node_DIRTY_MASK_RESET;\r
+ that._flags &= X_Node_BitMask_RESET_DIRTY;\r
return;\r
};\r
\r
};\r
// style\r
if( that._flags & X_Node_State.DIRTY_CSS ){\r
- if( that._cssText !== null || ( that._cssText = X_Node_CSS_objToCssText( that ) ) ){\r
+ if( that._flags & X_Node_State.OLD_CSSTEXT ? X_Node_CSS_objToCssText( that ) : that._cssText ){\r
elm.style.cssText = that._cssText;\r
} else {\r
elm.style.cssText = '';\r
};\r
delete that._newAttrs;\r
};\r
- \r
- //delete that._flags;\r
- that._flags &= X_Node_DIRTY_MASK_RESET;\r
+\r
+ that._flags &= X_Node_BitMask_RESET_DIRTY;\r
}) :\r
(function(){});\r
\r
\r
if( !that._tag ){\r
if( elm ) return elm;\r
- //delete that._flags;\r
- that._flags &= X_Node_DIRTY_MASK_RESET;\r
+ that._flags &= X_Node_BitMask_RESET_DIRTY;\r
return that._rawObject = document.createTextNode( X_String_chrReferanceTo( that._text ) );\r
};\r
\r
if( !elm ){\r
- if( that._flags & X_Node_State.DIRTY_CSS && !( that._cssText = X_Node_CSS_objToCssText( that ) ) ){\r
- delete that._cssText;\r
- };\r
- that._isNew = true;\r
+ that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that );\r
+\r
+ that._flags |= X_Node_State.ELM_NEED_INIT;\r
that._rawObject = elm =\r
X_Node_strictElmCreation ?\r
document.createElement( [\r
' UID="', that._uid, '"',\r
that._id ? ' id="' + that._id + '"' : '',\r
that._className ? ' class="' + that._className + '"' : '',\r
- that._attrText === false ? ( that._attrText = X_Node_Attr_objToAttrText( that._attrs ) ) : that._attrText,\r
+ that._flags & X_Node_State.OLD_ATTRTEXT ? X_Node_Attr_objToAttrText( that ) : that._attrText,\r
that._cssText ? ' style="' + that._cssText + '"' : '',\r
'>' ].join( '' ) ) :\r
document.createElement( that._tag );\r
+ \r
+ \r
+ console.log( '##' + that._attrText + '##' );\r
};\r
if( X_Node_useDocumentFragment ){\r
if( ( xnodes = that._xnodes ) && ( l = xnodes.length ) ){\r
} else {\r
if( that._rawObject && !isChild ) X_Node__actualRemove( that, true );\r
\r
- if( that._flags & X_Node_State.DIRTY_CSS && !( that._cssText = X_Node_CSS_objToCssText( that ) ) ){\r
- delete that._cssText;\r
- };\r
+ that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that );\r
\r
html = [\r
'<', that._tag, ' id=', ( that._id || ( 'ie4uid' + uid ) ), ' UID="', uid, '"',\r
that._className ? ' class="' + that._className + '"' : '',\r
- that._attrText === false ? ( that._attrText = X_Node_Attr_objToAttrText( that._attrs ) ) : that._attrText,\r
+ that._flags & X_Node_State.OLD_ATTRTEXT ? X_Node_Attr_objToAttrText( that ) : that._attrText,\r
that._cssText ? ' style="' + that._cssText + '"' : '',\r
'>' ];\r
\r
var X_Node__afterActualCreate =\r
X_UA_DOM.W3C ? (function( that ){\r
var elm = that._rawObject, xnodes, l, i;\r
-\r
- that._root = that.parent._root;\r
\r
if( !that._tag ){\r
- // that._flags && X_Node__updateRawNode( that, elm );\r
- that._flags & X_Node_DIRTY_MASK && X_Node__updateRawNode( that, elm );\r
+ that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
return that;\r
};\r
\r
xnodes = that._xnodes;\r
l = xnodes && xnodes.length;\r
\r
- if( that._isNew ){\r
- if( !X_Node_useDocumentFragment /*&& l*/ ){// docFrg が使えない場合、doc 追加後に子を追加\r
+ if( that._flags & X_Node_State.ELM_NEED_INIT ){\r
+ if( !X_Node_useDocumentFragment ){// docFrg が使えない場合、doc 追加後に子を追加\r
for( i = 0; i < l; ++i ){\r
elm.appendChild( X_Node__actualCreate( xnodes[ i ], true ) );\r
X_Node__afterActualCreate( xnodes[ i ] );\r
if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
elm.style.filter = X_Node_CSS_objToIEFilterText( that );;\r
};\r
- //delete that._flags;\r
- that._flags &= X_Node_DIRTY_MASK_RESET;\r
+ that._flags &= X_Node_BitMask_RESET_DIRTY;\r
} else {\r
elm.UID = that._uid;\r
that._newAttrs = that._attrs;\r
};\r
};\r
\r
- delete that._isNew;\r
+ that._flags ^= X_Node_State.ELM_NEED_INIT;\r
} else {\r
\r
for( i = 0; i < l; ++i ){\r
};\r
// 親要素の updateRawNode 前に子要素の updateRawNode を行う\r
// 親要素が GPU レイヤーに転送されるケースがあるので、先に子要素の変更を済ませる\r
- //that._flags && X_Node__updateRawNode( that, elm );\r
- that._flags & X_Node_DIRTY_MASK && X_Node__updateRawNode( that, elm );\r
+ that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
}; \r
\r
// src の onload があるので先ではないか?\r
}) :\r
X_UA_DOM.IE4 ? (function( that ){\r
var xnodes, i;\r
- that._root = that.parent._root;\r
+ that._flags |= X_Node_State.IE4_TEXTNODE_EXIST;\r
\r
if( !that._tag ) return that;\r
\r
if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
X_Node__ie4getRawNode( that ).style.filter = X_Node_CSS_objToIEFilterText( that );;\r
};\r
- //delete that._flags;\r
- that._flags &= X_Node_DIRTY_MASK_RESET;\r
+ that._flags &= X_Node_BitMask_RESET_DIRTY;\r
X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
}) :\r
(function(){});\r
if( !elm ) return;\r
that._listeners && X_EventDispatcher_toggleAllEvents( that, false );// イベントの退避\r
if( !X_UA.MacIE ){\r
- // elm.parentNode.tagName for ie7 -> that.state & ELM_IN_TREE\r
+ // elm.parentNode.tagName for ie7\r
!isChild && elm.parentNode && elm.parentNode.tagName && elm.parentNode.removeChild( elm );\r
} else {\r
!isChild && elm.parentNode && elm.parentNode.tagName && X_TEMP._fixed_remove( elm, that );\r
css = [],
n = -1,
p, v, specialFix, filterFix;
-
- if( !obj ) return ''; // Opera7.5 未満?
+
+ that._flags &= ~X_Node_State.OLD_CSSTEXT;
+
+ if( !obj ){ // Opera7.5 未満?
+ delete that._cssText;
+ return '';
+ };
for( p in obj ){
// object の拡張に備えて plain なオブジェクトを用意し、そのメンバーと一致するものは処理の対象外。
if( specialFix = X_Node_CSS_SPECIAL_FIX_PROP[ p ] ){
css[ ++n ] = p + ':' + specialFix( v );
-
} else
if( X_Node_CSS_FILTER_FIX_PROPS && X_Node_CSS_FILTER_FIX_PROPS[ p ] ){
( filterFix || ( filterFix = {} ) )[ p ] = v;
-
} else {
css[ ++n ] = p + ':' + v;
};
filterFix && ( css[ ++n ] = 'filter:' + X_Node_CSS_objToIEFilterText( that, filterFix ) );
- return css.join( ';' );
+ if( 0 <= n ){
+ return that._cssText = css.join( ';' );
+ };
+ delete that._cssText;
+ return '';
};
var
};
function X_Node_CSS_onAfterUpdateForIEFilterFix(){
- if( this._root ){ // 要素があり、要素がツリーに属している
+ if( this._flags & X_Node_State.IN_TREE ){ // 要素があり、要素がツリーに属している
this._flags |= X_Node_State.DIRTY_IE_FILTER;
X_Node_reserveUpdate();
};
// name, value setter
Node.prototype.css = function( nameOrObj /* orUnitID, valuOrUnitOrName */ ){
- var plain = X_EMPTY_OBJECT,
- args = arguments,
- css = this._css,
- p, name, v, camelize, unit, ieFix;
+ var args = arguments,
+ css = this._css,
+ p, name, v, plain, camelize;
if( !this._tag ) return this;
// setter:object
if( X.Type.isObject( nameOrObj ) ){
if( !css ) css = this._css = {};
+ plain = X_EMPTY_OBJECT;
camelize = X_Node_CSS_camelize;
- ieFix = X_Node_CSS_FILTER_FIX_PROPS;
for( p in nameOrObj ){
if( plain[ p ] ) continue;
-
- if( ieFix && ieFix[ p ] ){
- this._flags |= X_Node_State.DIRTY_IE_FILTER;
- };
- v = nameOrObj[ p ];
- v || v === 0 ? css[ camelize( p ) ] = v : delete css[ camelize( p ) ];
- if( p === 'display' ){
- v === 'none' ? ( this._flags |= X_Node_State.IE5_DISPLAY_NONE_FIX ) : ( this._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX );
- v === 'none' ? ( this._flags |= X_Node_State.STYLE_IS_DISPLAY_NONE ) : ( this._flags &= ~X_Node_State.STYLE_IS_DISPLAY_NONE );
- };
+ name = camelize( p );
+ v = nameOrObj[ p ];
+ if( css[ name ] === v ) continue;
+ this._flags = X_Node_CSS_setStyle( css, this._flags, name, v );
};
- this._flags |= X_Node_State.DIRTY_CSS;
- this.parent && X_Node_reserveUpdate();
+ this._flags |= X_Node_State.DIRTY_CSS | X_Node_State.OLD_CSSTEXT;
+ this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();
delete this._cssText;
return this;
} else
name = X_Node_CSS_camelize( nameOrObj );
v = args[ 1 ];
if( css[ name ] === v ) return this;
- if( X_Node_CSS_FILTER_FIX_PROPS && X_Node_CSS_FILTER_FIX_PROPS[ name ] ){
- this._flags |= X_Node_State.DIRTY_IE_FILTER;
- };
- if( !v && v !== 0 ){
- delete css[ name ];
- } else {
- css[ name ] = v;
- };
+ this._flags = X_Node_CSS_setStyle( css, this._flags, name, v ) | X_Node_State.DIRTY_CSS | X_Node_State.OLD_CSSTEXT;
+ this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();
delete this._cssText;
- this._flags |= X_Node_State.DIRTY_CSS;
- if( name === 'display' ){
- v === 'none' ? ( this._flags |= X_Node_State.IE5_DISPLAY_NONE_FIX ) : ( this._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX );
- v === 'none' ? ( this._flags |= X_Node_State.STYLE_IS_DISPLAY_NONE ) : ( this._flags &= ~X_Node_State.STYLE_IS_DISPLAY_NONE );
- };
- // TODO this._flags & in tree
- this.parent && X_Node_reserveUpdate();
return this;
};
// getter
if( !css ) return;
// 集計 border, padding, margin, backgroundPosition, clip
- // border で正確なデータを返せない時は、null を返す
+ // TODO border で正確なデータを返せない時は、null を返す
return css[ X_Node_CSS_camelize( nameOrObj ) ];
};
+function X_Node_CSS_setStyle( css, flags, name, newValue ){
+
+ if( X_Node_CSS_FILTER_FIX_PROPS && X_Node_CSS_FILTER_FIX_PROPS[ name ] ){
+ flags |= X_Node_State.DIRTY_IE_FILTER;
+ };
+ if( !newValue && newValue !== 0 ){
+ delete css[ name ];
+ } else {
+ css[ name ] = newValue;
+ };
+
+ switch( name ){
+ case 'display' :
+ newValue === 'none' ? ( flags |= X_Node_State.STYLE_IS_DISPLAY_NONE ) : ( flags &= ~X_Node_State.STYLE_IS_DISPLAY_NONE );
+ return flags;
+
+ case 'visibility' :
+ // すでに opacity:0 で invisible
+ if( flags & X_Node_State.STYLE_IS_INVISIBLE && css[ 'opacity' ] == 0 ) return flags;
+ newValue === 'hidden' ? ( flags |= X_Node_State.STYLE_IS_INVISIBLE ) : ( flags &= ~X_Node_State.STYLE_IS_INVISIBLE );
+ return flags;
+
+ case 'opacity' :
+ // すでに visibility:hidden で invisible
+ if( flags & X_Node_State.STYLE_IS_INVISIBLE && css[ 'visibility' ] === 'hidden' ) return flags;
+ newValue == 0 ? ( flags |= X_Node_State.STYLE_IS_INVISIBLE ) : ( flags &= ~X_Node_State.STYLE_IS_INVISIBLE );
+ return flags;
+
+ case 'overflow' :
+ newValue === 'hidden' ? ( flags |= X_Node_State.STYLE_IS_NO_OVERFLOW ) : ( flags &= ~X_Node_State.STYLE_IS_NO_OVERFLOW );
+ return flags;
+
+ case 'position' :
+ newValue === 'absolute' ? ( flags |= X_Node_State.STYLE_IS_POS_ABSOLUTE ) : ( flags &= ~X_Node_State.STYLE_IS_POS_ABSOLUTE );
+ return flags;
+
+ case 'width' :
+ newValue = X_Node_CSS__splitValueAndUnit( newValue );
+ if( newValue[ 1 ] !== '%' ){
+ flags |= X_Node_State.STYLE_IS_WIDTH_LENGTH;
+ flags &= ~X_Node_State.STYLE_IS_WIDTH_PCT;
+ } else {
+ flags &= ~X_Node_State.STYLE_IS_WIDTH_LENGTH;
+ flags |= X_Node_State.STYLE_IS_WIDTH_PCT;
+ };
+ return flags;
+
+ case 'height' :
+ newValue = X_Node_CSS__splitValueAndUnit( newValue );
+ if( newValue[ 1 ] !== '%' ){
+ flags |= X_Node_State.STYLE_IS_HEIGHT_LENGTH;
+ flags &= ~X_Node_State.STYLE_IS_HEIGHT_PCT;
+ } else {
+ flags &= ~X_Node_State.STYLE_IS_HEIGHT_LENGTH;
+ flags |= X_Node_State.STYLE_IS_HEIGHT_PCT;
+ };
+ return flags;
+
+ case 'fontSize' :
+
+ };
+ return flags;
+};
+
Node.prototype.cssText = function( v ){
var obj, i, l, attr, name;
+
+ if( v === this._cssText && ( this._flags & X_Node_State.OLD_CSSTEXT ) === 0 ){
+ return this;
+ };
+
if( v === '' ){
delete this._css;
- this._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX;
- this._flags |= X_Node_State.DIRTY_CSS;
- this.parent && X_Node_reserveUpdate();
delete this._cssText;
+ this._flags |= X_Node_State.DIRTY_CSS;
+ this._flags &= ~X_Node_State.OLD_CSSTEXT; // ~X_Node_State.DIRTY_IE_FILTER
+ this._flags &= X_Node_BITMASK_RESET_STYLE;
+ this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();
return this;
} else
if( X.Type.isString( v ) ){
delete this._css;
- this._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX;
obj = {};
v = v.split( ';' ); // TODO content ";" などにも対応
for( i = 0, l = v.length; i < l; ++i ){
return this.css( obj );
};
// getter
- if( this._flags & X_Node_State.DIRTY_CSS && !( this._cssText = X_Node_CSS_objToCssText( this ) ) ){
- delete this._cssText;
- };
+ this._flags & X_Node_State.OLD_CSSTEXT && X_Node_CSS_objToCssText( this );
return this._cssText;
};
if( _v = X_Node_CSS__UNIT_RATIO[ u ] ) return that._fontSize = v / _v;
};
} else {
- v = 1;
- u = 'em';
+ // 要素を生成して測定!
+ ( that._rawObject || X_Node__ie4getRawNode( that ) ).insertAdjacentHTML( 'BeforeEnd', '<div id="ie4charsize" style="position:absolute;top:0;left:0;">X</div>' );
+ elm = document.all[ 'ie4charsize' ];
+ v = elm.offsetHeight;
+ elm.removeAttribute( 'id' ); // ?
+ elm.outerHTML = '';
+ return that._fontSize = v;
};
switch( u ){