DIRTY_CLASSNAME : 2 << 13, // X_Node_CSS_getCharSize, width, height, x, y\r
DIRTY_ATTR : 2 << 14, // X_Node_CSS_getCharSize, width, height, x, y\r
DIRTY_CSS : 2 << 15, // X_Node_CSS_getCharSize, width, height, x, y\r
- DIRTY_IE_FILTER : X_UA.IE < 10 && X_UA.ActiveX ? 2 << 16 : 0, // \r
+ DIRTY_IE_FILTER : X_UA[ 'IE' ] < 10 && X_UA[ 'ActiveX' ] ? 2 << 16 : 0, // \r
\r
ACTUAL_LISTENING : 2 << 17,\r
OLD_ATTRTEXT : 2 << 18,\r
GPU_RESERVED : 2 << 21, // 2:GPU予約\r
GPU_NOW : 2 << 22, // 3:GPU now!\r
GPU_RELEASE_RESERVED : 2 << 23, // 4:GPU解除予約\r
+ GPU_CHILD : 2 << 24, \r
\r
- IE4_HAS_TEXTNODE : X_UA.IE4 ? 2 << 21 : 0,\r
- IE4_HAS_ELEMENT : X_UA.IE4 ? 2 << 22 : 0,\r
- IE4_DIRTY_CHILDREN : X_UA.IE4 ? 2 << 23 : 0,\r
- IE4_FIXED : X_UA.IE4 ? 2 << 24 : 0,\r
+ IE4_HAS_TEXTNODE : X_UA[ 'IE4' ] ? 2 << 21 : 0,\r
+ IE4_HAS_ELEMENT : X_UA[ 'IE4' ] ? 2 << 22 : 0,\r
+ IE4_DIRTY_CHILDREN : X_UA[ 'IE4' ] ? 2 << 23 : 0,\r
+ IE4_FIXED : X_UA[ 'IE4' ] ? 2 << 24 : 0,\r
\r
- IE5_DISPLAY_NONE_FIX : X_UA.IE5 && X_UA.ActiveX ? 2 << 24 : 0\r
+ IE5_DISPLAY_NONE_FIX : X_UA[ 'IE5' ] && X_UA[ 'ActiveX' ] ? 2 << 24 : 0\r
},\r
\r
X_Node_BITMASK_RESET_STYLE = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ (\r
IMAGE : 10\r
},\r
\r
- X_Node_strictElmCreation = !X_UA.MacIE && X_UA.IE5678,// && !X_UA.MacIE;\r
+ X_Node_strictElmCreation = !X_UA[ 'MacIE' ] && X_UA[ 'IE' ] <= 8,\r
\r
- X_Node_documentFragment = document.createDocumentFragment && ( !X_UA.IE || 5.5 <= X_UA.IE ) && document.createDocumentFragment(),\r
+ X_Node_documentFragment = document.createDocumentFragment && ( !X_UA[ 'IE' ] || 5.5 <= X_UA[ 'IE' ] ) && document.createDocumentFragment(),\r
\r
// 子の生成後に リアル文書 tree に追加する\r
- X_Node_addTreeAfterChildren = !( X.UA.IE < 9 ),\r
+ X_Node_addTreeAfterChildren = !( X_UA[ 'IE' ] < 9 ),\r
\r
X_Node_displayNoneFixForIE5 = !!X_Node_State.IE5_DISPLAY_NONE_FIX,\r
\r
\r
X_Node_outerXNode = null,\r
\r
- X_Node_updateTimerID = 0,\r
-/*\r
+ X_Node_updateTimerID = 0;\r
+\r
+/**\r
* Node( rawElement | rawTextnode | htmlString | textString )\r
- */ \r
- Node = X.Node = X.EventDispatcher.inherits(\r
- 'XDomNode',\r
+ * \r
+ * @alias X.Node\r
+ * @class Node HTMLElement、TextNode をラップし jQuery 風な API で操作できます。\r
+ * @constructor \r
+ * @constructs Node\r
+ * @extends {EventDispatcher}\r
+ */\r
+var Node = X.Node = X.EventDispatcher.inherits(\r
+ 'X.Node',\r
X.Class.POOL_OBJECT, // X.Class.FINAL\r
{\r
_uid : 0,\r
length : 1,\r
parent : null, // remove された枝も親子構造は維持している。\r
_xnodes : null, // Array.<Node>\r
+ _gpuParent : null, // TODO\r
\r
_tag : '',\r
_text : '',\r
this._tag = v.toUpperCase();\r
arguments[ 1 ] && this.attr( arguments[ 1 ] );\r
css = arguments[ 2 ];\r
- css && this[ X.Type.isString( css ) ? 'cssText' : 'css' ]( css );\r
+ css && this[ X_Type_isString( css ) ? 'cssText' : 'css' ]( css );\r
} else\r
if( X_Node_newByText ){\r
X_Node_newByText = false;\r
this._text = v;\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( X_Type_isArray( v ) && v.length ) return new X_NodeList( v );\r
\r
switch( X_Node_getType( v ) ){\r
case X_Node_TYPE.XNODE :\r
if( v === document ) return X_Node_TYPE.DOCUMENT;\r
if( v.constructor === Node ) return X_Node_TYPE.XNODE;\r
if( v.constructor === X_NodeList ) return X_Node_TYPE.XNODE_LIST;\r
- if( X.Type.isHTMLElement( v ) ) return X_Node_TYPE.RAW_HTML;\r
+ if( X_Type_isHTMLElement( v ) ) return X_Node_TYPE.RAW_HTML;\r
if( v.nodeType === 3 ) return X_Node_TYPE.RAW_TEXT;\r
- if( X.Type.isString( v ) ){\r
+ if( X_Type_isString( v ) ){\r
return '<' === v.charAt( 0 ) && v.charAt( v.length - 1 ) === '>' ? X_Node_TYPE.HTML_STRING : X_Node_TYPE.STRING;\r
};\r
return 0;\r
X_UA_DOM.IE4 ?\r
X.emptyFunction :\r
(function( root ){\r
- if( X.Type.isBoolean( root.isXML ) ) return root.isXML;\r
+ if( X_Type_isBoolean( root.isXML ) ) return root.isXML;\r
return root.isXML = root._rawObject.createElement( 'p' ).tagName !== root._rawObject.createElement( 'P' ).tagName;\r
}),\r
X_Node_CHASHE = [],\r
};\r
};\r
\r
+function X_Node_toggleInGPUFlag( gpuRoot, xnodes, flag ){\r
+ var i = xnodes.length, xnode;\r
+\r
+ if( flag ){\r
+ for( ; i; ){\r
+ xnode = xnodes[ --i ];\r
+ if( !xnode._gpuParent ){\r
+ xnode._flags |= X_Node_State.GPU_CHILD;\r
+ xnode._gpuParent = gpuRoot;\r
+ xnode._xnodes && X_Node_toggleInTreeFlag( gpuRoot, xnode._xnodes, flag ); \r
+ };\r
+ };\r
+ } else {\r
+ for( ; i; ){\r
+ xnode = xnodes[ --i ];\r
+ if( xnode._gpuParent === gpuRoot ){\r
+ xnode._flags &= ~X_Node_State.GPU_CHILD;\r
+ delete xnode._gpuParent;\r
+ xnode._xnodes && X_Node_toggleInTreeFlag( gpuRoot, xnode._xnodes, flag );\r
+ };\r
+ };\r
+ };\r
+};\r
+\r
/* --------------------------------------\r
* Create\r
*/\r
// 親の xnodes から v を消す\r
v.parent && v.remove();\r
// IE4 でテキストノードの追加、FIXED 済でない場合、親に要素の追加を通知\r
- if( X_UA.IE4 && !v._tag && ( this._flags & X_Node_State.IE4_FIXED ) === 0 ) this._flags |= X_Node_State.IE4_DIRTY_CHILDREN;\r
+ if( X_UA[ 'IE4' ] && !v._tag && ( this._flags & X_Node_State.IE4_FIXED ) === 0 ) this._flags |= X_Node_State.IE4_DIRTY_CHILDREN;\r
break;\r
default :\r
return this;\r
// 親の xnodes から v を消す\r
v.parent && v.remove();\r
// IE4 でテキストノードの追加、FIXED 済でない場合、親に要素の追加を通知\r
- if( X_UA.IE4 && !v._tag && ( this._flags & X_Node_State.IE4_FIXED ) === 0 ) this._flags |= X_Node_State.IE4_DIRTY_CHILDREN;\r
+ if( X_UA[ 'IE4' ] && !v._tag && ( this._flags & X_Node_State.IE4_FIXED ) === 0 ) this._flags |= X_Node_State.IE4_DIRTY_CHILDREN;\r
break;\r
default :\r
return this;\r
function X_Node_destroy( isChild ){\r
var xnodes = this._xnodes, i, elm;\r
\r
- if( !this._flags ) return;\r
+ if( ( this._flags & X_Node_State.EXIST ) === 0 ) return;\r
\r
elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
\r
\r
if( this._flags & X_Node_State.IN_TREE ){\r
!isChild && this.remove();\r
- delete this._flags;\r
+ this._flags &= ~X_Node_State.EXIST;\r
} else {\r
this.parent && this.parent._xnodes.splice( this.parent._xnodes.indexOf( this ), 1 );\r
elm && !isChild && X_Node__actualRemove( this );\r
function X_Node_onBeforeKill( e ){\r
var xnodes = this._xnodes, i, elm;\r
\r
- if( !this._flags ) return X.Callback.NONE;\r
+ if( ( this._flags & X_Node_State.EXIST ) === 0 ) return X.Callback.NONE;\r
\r
elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
elm && this._listeners && this.unlisten(); // イベントの退避\r
if( e ){\r
this.remove();\r
if( X_Node_reserveRemoval[ X_Node_reserveRemoval.length - 1 ] === this ){\r
- delete this._flags;\r
+ this._flags &= ~X_Node_State.EXIST;\r
return X.Callback.PREVENT_DEFAULT; \r
}; \r
};\r
\r
// setter\r
if( this._className === v ) return this;\r
- if( !v || !X.Type.isString( v ) ){\r
+ if( !v || !X_Type_isString( v ) ){\r
delete this._className;\r
} else {\r
// cleanup\r
};\r
return this;\r
};\r
- if( !text ) return this.empty();\r
if( ( xnodes = this._xnodes ) && xnodes.length === 1 && !xnodes[ 0 ]._tag ){\r
xnodes[ 0 ].text( text );\r
return this;\r
};\r
+ // TODO 一つのtextnode を残すケース 完全に削除したい場合は empty()を使う\r
+ if( !text ) return this.empty(); \r
this.empty().createText( text );\r
return this;\r
};\r
};\r
\r
func = raw[ name ];\r
- if( X.Type.isFunction( func ) ){\r
+ if( X_Type_isFunction( func ) ){\r
if( l ){\r
args = X_Object_cloneArray( arguments );\r
args.shift();\r
};\r
return raw[ name ](); \r
} else\r
- if( X.Type.isUnknown( func ) ){\r
+ if( X_Type_isUnknown( func ) ){\r
// typeof func === unknown に対策\r
// http://la.ma.la/blog/diary_200509031529.htm \r
if( l ){\r
\r
if( time ){\r
// X.Timer 経由でないと発火しない このイベントでサイズを取ると無限ループに\r
- X_System._listeners && X_System._listeners[ X.Event.BEFORE_UPDATE ] && X_System.dispatch( X.Event.BEFORE_UPDATE );\r
+ X_System._listeners && X_System._listeners[ X_Event.BEFORE_UPDATE ] && X_System.dispatch( X_Event.BEFORE_UPDATE );\r
};\r
\r
removal = X_Node_reserveRemoval;\r
xnode = removal[ --i ];\r
// TODO GPU レイヤーの子の場合、remove をスキップする。 非GPU レイヤーへ apppend される場合、clone する?\r
X_Node__actualRemove( xnode );\r
- !xnode._flags && xnode.kill();\r
+ ( xnode._flags & X_Node_State.EXIST ) === 0 && xnode.kill();\r
};\r
removal.length = 0;\r
};\r
\r
if( time ){\r
// X.Timer 経由でないと発火しない このイベントでサイズを取ると無限ループに\r
- X_System._listeners && X_System._listeners[ X.Event.UPDATED ] && X_System.dispatch( X.Event.UPDATED ); \r
+ X_System._listeners && X_System._listeners[ X_Event.UPDATED ] && X_System.dispatch( X_Event.UPDATED ); \r
};\r
\r
- X_ViewPort._listeners && X_ViewPort._listeners[ X.Event.AFTER_UPDATE ] && X_ViewPort.asyncDispatch( X.Event.AFTER_UPDATE );\r
+ X_ViewPort._listeners && X_ViewPort._listeners[ X_Event.AFTER_UPDATE ] && X_ViewPort.asyncDispatch( X_Event.AFTER_UPDATE );\r
};\r
\r
/*\r
if( !that._tag ){\r
that._flags &= X_Node_BitMask_RESET_DIRTY;\r
that._rawObject = elm = document.createTextNode( X_String_chrReferanceTo( that._text ) );\r
- if( !X.UA.IE ){\r
+ if( !X_UA[ 'IE' ] ){\r
elm.UID = that._uid;\r
};\r
} else\r
\r
if( X_Node_documentFragment ){\r
//( frg = X_Node_documentFragment ).appendChild( elm );\r
+ // 連続する要素の差し替えの場合に有効\r
};\r
\r
if( X_Node_strictElmCreation ){\r
that._flags &= X_Node_BitMask_RESET_DIRTY;\r
// ie の string から要素を作る場合、ネットワーク系属性は onload イベントなどを拾うために、要素生成->イベント復帰後に適用する\r
- that._newAttrs && ( that._flags |= X_Node_State.DIRTY_ATTR ); // Network 系の属性は遅らせて設定\r
+ that._newAttrs && ( that._flags |= X_Node_State.DIRTY_ATTR ); // _newAttrs には ネットワーク系属性が入っている。Network 系の属性は遅らせて設定\r
that._flags |= X_Node_State.DIRTY_IE_FILTER;// doc 追加後に filter を指定しないと有効にならない。\r
} else {\r
elm.UID = that._uid;\r
\r
// http://outcloud.blogspot.jp/2010/09/iframe.html\r
// この問題は firefox3.6 で確認\r
- if( X_UA.Gecko ){\r
+ if( X_UA[ 'Gecko' ] ){\r
if( that._tag === 'IFRAME' && ( !that._attrs || !that._attrs[ 'src' ] ) ){\r
//elm.contentWindow.location.replace = elm.src = 'about:blank';\r
that.attr( 'src', 'about:blank' );\r
parentElement.insertBefore( elm, nextElement ) :\r
parentElement.appendChild( elm );\r
\r
- if( X_UA.Gecko && that._tag === 'IFRAME' && elm.contentWindow ){\r
+ if( X_UA[ 'Gecko' ] && that._tag === 'IFRAME' && elm.contentWindow ){\r
// tree に追加されるまで contentWindow は存在しない。\r
elm.contentWindow.location.replace = elm.src;\r
};\r
};\r
// className\r
if( that._flags & X_Node_State.DIRTY_CLASSNAME ){\r
- that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE < 8 ? 'className' : 'class' ) ); // className は ie7- \r
+ that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA[ 'IE' ] < 8 ? 'className' : 'class' ) ); // className は ie7- \r
};\r
\r
// attr\r
switch( that._tag + k ){\r
case 'TEXTAREAvalue' :\r
// IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので\r
- if( !X_UA.MacIE && X_UA.IE5x ){\r
+ if( !X_UA[ 'MacIE' ] && X_UA[ 'IE5x' ] ){\r
elm.firstChild ?\r
( elm.firstChild.data = v || '' ) :\r
elm.appendChild( document.createTextNode( v || '' ) );\r
case 'IFRAMEsrc' :\r
// http://outcloud.blogspot.jp/2010/09/iframe.html\r
// この問題は firefox3.6 で確認\r
- if( X_UA.Gecko && elm.contentWindow ){\r
+ if( X_UA[ 'Gecko' ] && elm.contentWindow ){\r
elm.contentWindow.location.replace = elm.src = v || '';\r
continue;\r
};\r
// http://d.hatena.ne.jp/NeoCat/20080921/1221940658\r
// こちらに名前をsetしないとtargetが動作しない\r
// これってあとから name を変更できないバグでは? itozyun\r
- // if( X_UA.IE ) elm.name = elm.contentWindow.name = v || '';\r
+ // if( X_UA[ 'IE' ] ) elm.name = elm.contentWindow.name = v || '';\r
};\r
\r
//if( X_EMPTY_OBJECT[ k ] ) continue;\r
// style\r
if( that._flags & X_Node_State.DIRTY_CSS ){\r
if( that._flags & X_Node_State.OLD_CSSTEXT ? X_Node_CSS_objToCssText( that ) : that._cssText ){\r
- X_UA.Opera78 || X_UA.NN6 ?\r
+ X_UA[ 'Opera78' ] || X_UA[ 'NN6' ] ?\r
elm.setAttribute( 'style', that._cssText ) : // opera8用\r
( elm.style.cssText = that._cssText );\r
} else {\r
X_Node__afterActualCreate( xnodes[ --i ] );\r
};\r
};\r
- // ã\83\8dã\83\83ã\83\88ã\82\8fã\83¼ã\81\86系属性と filter は要素生成後に適用\r
+ // ã\83\8dã\83\83ã\83\88ã\83¯ã\83¼ã\82¯系属性と filter は要素生成後に適用\r
if( that._flags & ( X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_IE_FILTER ) ){\r
X_Node__updateRawNode( that, that._rawObject || X_Node__ie4getRawNode( that ) );\r
} else {\r
};\r
};\r
\r
- if( !X_UA.MacIE ){\r
+ if( !X_UA[ 'MacIE' ] ){\r
// elm.parentNode.tagName for ie7\r
!isChild && elm.parentNode && elm.parentNode.tagName && elm.parentNode.removeChild( elm );\r
} else {\r
}) :\r
(function(){});\r
\r
-X_ViewPort.listenOnce( X.Event.UNLOAD, X_Node__actualRemove, [ X_Node_html, true ] );\r
+X_ViewPort.listenOnce( X_Event.UNLOAD, X_Node__actualRemove, [ X_Node_html, true ] );\r
\r