X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F02_dom%2F20_XNode.js;h=f09db3a1dc5e50a50876f9466af1b42c815e5ca2;hb=009b1cd0cebdd15591a9abfb964fb57b41ccb5f9;hp=1656421e681a5d1267e9331c9ac4e10115f16ab7;hpb=d5cd3943f09c2e3ca76ddb2959c911e6ff4a38d7;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 1656421..f09db3a 100644 --- a/0.6.x/js/02_dom/20_XNode.js +++ b/0.6.x/js/02_dom/20_XNode.js @@ -1202,7 +1202,7 @@ function X_Node_call( name /*, opt_args... */ ){ var args = arguments, l = args.length - 1, v, raw, parent, body, - childX, childY, childW, childH, + child, childX, childY, childW, childH, parentW, parentH, parentSX, parentSY, parentSW, parentSH, visibleX, visibleY, visibleW, visibleH, @@ -1223,7 +1223,7 @@ function X_Node_call( name /*, opt_args... */ ){ case 'treeIsDirty' : return !!X_Node_updateTimerID; case 'fontSize' : - return this.parent ? X_Node_CSS_getCharSize( this ) : 0; + return ( this[ '_flags' ] & X_NodeFlags_IN_TREE ) ? X_Node_CSS_getCharSize( this ) : 0; case 'inGPU' : return !!( this[ '_flags' ] & ( X_NodeFlags_GPU_NOW | X_NodeFlags_GPU_RELEASE_RESERVED ) ); case 'isGPUChild' : @@ -1258,6 +1258,7 @@ function X_Node_call( name /*, opt_args... */ ){ }; if( name === 'inView' ){ + if( !( this[ '_flags' ] & X_NodeFlags_IN_TREE ) ) return { 'isInView' : false }; body = X_elmBody; child = raw; visibleX = visibleY = visibleW = visibleH = 0; @@ -1367,7 +1368,7 @@ function X_Node_reserveUpdate(){ var X_Node_updateReservedByReleaseGPU = false; function X_Node_startUpdate( time ){ - var removal, i, xnodeOrElm; + var removal, i, xnodeOrElm, xnodesIEFilterFixAfter, xnode; if( !X_Node_updateTimerID || X_ViewPort_readyState < X_EVENT_INIT ){ return; @@ -1407,24 +1408,33 @@ function X_Node_startUpdate( time ){ removal.length = 0; }; + + X_UA[ 'IE5' ] && ( X_elmBody.style.visibility = 'hidden' ); + if( X_Node_html[ '_flags' ] & X_Node_BitMask_IS_DIRTY ){ - X_Node__commitUpdate( X_Node_html, X_Node_html[ '_rawObject' ].parentNode, null, X_Node_html[ '_flags' ], 1 ); + X_Node__commitUpdate( X_Node_html, X_Node_html[ '_rawObject' ].parentNode, null, X_Node_html[ '_flags' ], 1, xnodesIEFilterFixAfter = [] ); } else { - X_Node__commitUpdate( X_Node_head, X_Node_head[ '_rawObject' ].parentNode, null, X_Node_head[ '_flags' ], 1 ); - X_Node__commitUpdate( X_Node_body, X_Node_body[ '_rawObject' ].parentNode, null, X_Node_body[ '_flags' ], 1 ); + X_Node__commitUpdate( X_Node_head, X_Node_head[ '_rawObject' ].parentNode, null, X_Node_head[ '_flags' ], 1, xnodesIEFilterFixAfter = [] ); + X_Node__commitUpdate( X_Node_body, X_Node_body[ '_rawObject' ].parentNode, null, X_Node_body[ '_flags' ], 1, xnodesIEFilterFixAfter = [] ); }; + X_UA[ 'IE5' ] && ( X_elmBody.style.visibility = '' ); + if( X_Node_updateReservedByReleaseGPU ){ X_Node_reserveUpdate(); X_Node_updateReservedByReleaseGPU = false; }; - if( time ){ - // X.Timer 経由でないと発火しない このイベントでサイズを取ると無限ループに - X_System[ '_listeners' ] && X_System[ '_listeners' ][ X_EVENT_UPDATED ] && X_System[ 'dispatch' ]( X_EVENT_UPDATED ); - } else { - X_System[ '_listeners' ] && X_System[ '_listeners' ][ X_EVENT_UPDATED ] && X_System[ 'asyncDispatch' ]( X_EVENT_UPDATED ); + if( X_NodeFlags_IE_FILTER_FIX_AFTER && xnodesIEFilterFixAfter.length ){ + for( i = 0; xnode = xnodesIEFilterFixAfter[ i ]; ++i ){ + xnode[ '_flags' ] &= ~X_NodeFlags_IE_FILTER_FIX_AFTER; + X_Node_CSS_onAfterUpdateIEFilterFix( xnode ); + }; }; + + // time を視て X.Timer 経由の場合、即座に発火する。 + // width() 等で強制的にツリーを構築している場合、UPDATE イベントのコールバックで要素を変更しサイズを取ると無限ループになる,これを防ぐため asyncDispatch とする + X_System[ '_listeners' ] && X_System[ '_listeners' ][ X_EVENT_UPDATED ] && X_System[ time ? 'dispatch' : 'asyncDispatch' ]( X_EVENT_UPDATED ); X_ViewPort[ '_listeners' ] && X_ViewPort[ '_listeners' ][ X_EVENT_AFTER_UPDATE ] && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_AFTER_UPDATE ); }; @@ -1444,13 +1454,13 @@ function X_Node_startUpdate( time ){ */ var X_Node__commitUpdate = X_UA_DOM.W3C ? - ( function( that, parentElement, nextElement, accumulatedFlags, ie8opacity ){ + ( function( that, parentElement, nextElement, accumulatedFlags, ie8AccumulatedOpcity, xnodesIEFilterFixAfter ){ var elm = that[ '_rawObject' ], - created, xnodes, l, next; + created, xnodes, l, next, anime, v, currentOpcity; // 1. GPU 一切の更新をスキップ if( that[ '_flags' ] & X_NodeFlags_GPU_NOW ){ - console.log( '更新のskip ' + !!( that[ '_flags' ] & X_Node_BitMask_IS_DIRTY ) ); + console.log( '更新のskip ' + that[ '_className' ] + !!( that[ '_flags' ] & X_Node_BitMask_IS_DIRTY ) ); that[ '_flags' ] & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm ); return elm; }; @@ -1474,7 +1484,8 @@ var X_Node__commitUpdate = if( that[ '_flags' ] & X_NodeFlags_STYLE_IS_DISPLAY_NONE ){ if( X_Node_displayNoneFixForIE5 ){ // filter の効いている要素を含む要素は display:none が無視される。 - // filter = '' で削除はできるが、再表示時に filter が消える。 -> filter な要素を削除してしまう。 + // filter = '' で削除はできるが、再表示時に filter が消える。 -> filter な要素を削除してしまう。 + // TODO filters[0].enabled = false なんてどう? if( elm && elm.parentNode ){ X_Node__actualRemove( that ); }; @@ -1578,12 +1589,13 @@ var X_Node__commitUpdate = }; // ie8 では子要素に opacity が反映されないため、親要素の opacity を積算する - ie8opacity = ie8opacity * ( that[ '_css' ] && 0 <= that[ '_css' ].opacity ? that[ '_css' ].opacity : 1 ); + currentOpcity = that[ '_css' ] && 0 <= that[ '_css' ].opacity && that[ '_css' ].opacity; + ie8AccumulatedOpcity = ie8AccumulatedOpcity * ( currentOpcity || 1 ); // 8. 更新の適用 if( accumulatedFlags & X_Node_BitMask_IS_DIRTY ){ delete that[ '_fontSize' ]; - X_Node__updateRawNode( that, elm, ie8opacity, accumulatedFlags ); + X_Node__updateRawNode( that, elm, currentOpcity, ie8AccumulatedOpcity, accumulatedFlags ); }; // 9. ie5 only @@ -1600,10 +1612,14 @@ var X_Node__commitUpdate = }; }; + if( that[ '_flags' ] & X_NodeFlags_IE_FILTER_FIX_AFTER ){ + xnodesIEFilterFixAfter[ xnodesIEFilterFixAfter.length ] = that; + }; + // 10. 子要素の更新。 if( ( xnodes = that[ '_xnodes' ] ) && ( l = xnodes.length ) ) { for( ; l; ){ - next = X_Node__commitUpdate( xnodes[ --l ], elm, next, accumulatedFlags, ie8opacity ); + next = X_Node__commitUpdate( xnodes[ --l ], elm, next, accumulatedFlags, ie8AccumulatedOpcity, xnodesIEFilterFixAfter ); }; }; @@ -1618,12 +1634,34 @@ var X_Node__commitUpdate = }; }; +/* + * if( ( anime = that[ '_anime' ] ) && 6 <= anime.phase && anime.doScroll ){ + if( anime.phase === 6 ){ + v = anime.fromScrollX; + if( v === v ){ + elm.scrollLeft = v; + } else { + anime.fromScrollX = elm.scrollLeft; + }; + v = anime.fromScrollY; + if( v === v ){ + elm.scrollTop = v; + } else { + anime.fromScrollY = elm.scrollTop; + }; + } else { + elm.scrollLeft = anime.scrollX; + elm.scrollTop = anime.scrollY; + }; + }; + */ + return elm; }) : X_UA_DOM.IE4 ? ( function( that, parentElement, prevElement, accumulatedFlags ){ var elm = that[ '_rawObject' ] || X_Node__ie4getRawNode( that ), - xnodes, l, i, dirty, mix, html, text, prev; + xnodes, l, i, dirty, mix, html, text, prev, anime, v; if( !that[ '_tag' ] ){ that[ '_flags' ] & X_NodeFlags_DIRTY_CONTENT && X_Node__updateRawNode( that, elm ); @@ -1647,68 +1685,90 @@ var X_Node__commitUpdate = prevElement.insertAdjacentHTML( 'AfterEnd', X_Node__actualCreate( that, false ) ) : parentElement.insertAdjacentHTML( 'AfterBegin', X_Node__actualCreate( that, false ) ); X_Node__afterActualCreate( that ); - return that[ '_rawObject' ] || X_Node__ie4getRawNode( that ); - }; - - accumulatedFlags |= that[ '_flags' ]; - - xnodes = that[ '_xnodes' ]; - l = xnodes ? xnodes.length : 0; - dirty = !!( that[ '_flags' ] & X_NodeFlags_IE4_DIRTY_CHILDREN ); - - /* - * HTML の下に TextNode だけ 。MIX_FIXED でない場合、削除、追加 を親に通知 - * HTML の下に HTML だけ - * HTML の下は MIX -> TextNode, html の削除、変更、追加 - * HTML の下は MIX_FIXED -> TextNode を に置き換えてあるのでW3C DON 的に触ることができる - */ - if( dirty ){ - that[ '_flags' ] &= ~X_NodeFlags_IE4_DIRTY_CHILDREN; - for( i = 0; i < l; ++i ){ - if( xnodes[ i ][ '_tag' ] ){ - that[ '_flags' ] |= X_NodeFlags_IE4_HAS_ELEMENT; - } else { - that[ '_flags' ] |= X_NodeFlags_IE4_HAS_TEXTNODE; + + elm = that[ '_rawObject' ] || X_Node__ie4getRawNode( that ); + } else { + accumulatedFlags |= that[ '_flags' ]; + + xnodes = that[ '_xnodes' ]; + l = xnodes ? xnodes.length : 0; + dirty = !!( that[ '_flags' ] & X_NodeFlags_IE4_DIRTY_CHILDREN ); + + /* + * HTML の下に TextNode だけ 。MIX_FIXED でない場合、削除、追加 を親に通知 + * HTML の下に HTML だけ + * HTML の下は MIX -> TextNode, html の削除、変更、追加 + * HTML の下は MIX_FIXED -> TextNode を に置き換えてあるのでW3C DON 的に触ることができる + */ + if( dirty ){ + that[ '_flags' ] &= ~X_NodeFlags_IE4_DIRTY_CHILDREN; + for( i = 0; i < l; ++i ){ + if( xnodes[ i ][ '_tag' ] ){ + that[ '_flags' ] |= X_NodeFlags_IE4_HAS_ELEMENT; + } else { + that[ '_flags' ] |= X_NodeFlags_IE4_HAS_TEXTNODE; + }; + if( that[ '_flags' ] & X_Node_BitMask_IE4_IS_MIX === X_Node_BitMask_IE4_IS_MIX ){ + mix = true; + break; + }; }; - if( that[ '_flags' ] & X_Node_BitMask_IE4_IS_MIX === X_Node_BitMask_IE4_IS_MIX ){ - mix = true; - break; + }; + + if( that[ '_flags' ] & X_NodeFlags_IE4_FIXED || that[ '_flags' ] & X_Node_BitMask_IE4_IS_MIX === X_NodeFlags_IE4_HAS_ELEMENT ){ + for( i = 0; i < l; ++i ){ + prev = X_Node__commitUpdate( xnodes[ i ], elm, prev, accumulatedFlags ); + }; + } else + if( mix ){ + html = []; + for( i = 0; i < l; ++i ){ + html[ i ] = X_Node__actualCreate( xnodes[ i ], false ); }; + elm.innerHTML = html.join( '' ); + for( i = 0; i < l; ++i ){ + X_Node__afterActualCreate( xnodes[ i ] ); + }; + that[ '_flags' ] |= X_NodeFlags_IE4_FIXED; + } else + if( that[ '_flags' ] & X_NodeFlags_IE4_HAS_TEXTNODE ){ + dirty = dirty || false; + for( i = 0; i < l; ++i ){ + text = xnodes[ i ]; + if( text[ '_flags' ] & X_Node_BitMask_IS_DIRTY ){ + text[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; + dirty = true; + }; + }; + if( dirty ) elm.innerHTML = that[ 'text' ](); }; + + if( accumulatedFlags & X_Node_BitMask_IS_DIRTY ) delete that[ '_fontSize' ]; + + that[ '_flags' ] &= ~X_NodeFlags_DIRTY_POSITION; + that[ '_flags' ] & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm ); }; - if( that[ '_flags' ] & X_NodeFlags_IE4_FIXED || that[ '_flags' ] & X_Node_BitMask_IE4_IS_MIX === X_NodeFlags_IE4_HAS_ELEMENT ){ - for( i = 0; i < l; ++i ){ - prev = X_Node__commitUpdate( xnodes[ i ], elm, prev, accumulatedFlags ); - }; - } else - if( mix ){ - html = []; - for( i = 0; i < l; ++i ){ - html[ i ] = X_Node__actualCreate( xnodes[ i ], false ); - }; - elm.innerHTML = html.join( '' ); - for( i = 0; i < l; ++i ){ - X_Node__afterActualCreate( xnodes[ i ] ); - }; - that[ '_flags' ] |= X_NodeFlags_IE4_FIXED; - } else - if( that[ '_flags' ] & X_NodeFlags_IE4_HAS_TEXTNODE ){ - dirty = dirty || false; - for( i = 0; i < l; ++i ){ - text = xnodes[ i ]; - if( text[ '_flags' ] & X_Node_BitMask_IS_DIRTY ){ - text[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; - dirty = true; + if( ( anime = that[ '_anime' ] ) && 6 <= anime.phase && anime.doScroll ){ + if( anime.phase === 6 ){ + v = anime.fromScrollX; + if( v === v ){ + elm.scrollLeft = v; + } else { + anime.fromScrollX = elm.scrollLeft; + }; + v = anime.fromScrollY; + if( v === v ){ + elm.scrollTop = v; + } else { + anime.fromScrollY = elm.scrollTop; }; + } else { + elm.scrollLeft = anime.scrollX; + elm.scrollTop = anime.scrollY; }; - if( dirty ) elm.innerHTML = that[ 'text' ](); }; - - if( accumulatedFlags & X_Node_BitMask_IS_DIRTY ) delete that[ '_fontSize' ]; - - that[ '_flags' ] &= ~X_NodeFlags_DIRTY_POSITION; - that[ '_flags' ] & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm ); + return elm; }) : (function(){}); @@ -1718,9 +1778,9 @@ var X_Node__commitUpdate = */ var X_Node__updateRawNode = X_UA_DOM.W3C ? - ( function( that, elm, ie8opacity, accumulatedFlags ){ + ( function( that, elm, currentOpcity, ie8AccumulatedOpcity, accumulatedFlags ){ var // flags = that[ '_flags' ], - attrs, rename, k, v, memory, f; + attrs, rename, k, v, f; // textNode if( !that[ '_tag' ] ){ @@ -1795,12 +1855,10 @@ var X_Node__updateRawNode = delete that[ '_newAttrs' ]; }; - if( accumulatedFlags & X_NodeFlags_IE8_OPACITY_FIX ){ - memory = that[ '_css' ] && that[ '_css' ].opacity; - if( f = true ){ - if( !that[ '_css' ] ) that[ '_css' ] = {}; - that[ '_css' ].opacity = ie8opacity; + if( 0 <= currentOpcity ){ + f = true; + that[ '_css' ].opacity = ie8AccumulatedOpcity; if( that[ '_flags' ] & X_NodeFlags_DIRTY_CSS ){ that[ '_flags' ] |= X_NodeFlags_OLD_CSSTEXT; } else @@ -1832,13 +1890,13 @@ var X_Node__updateRawNode = }; }; + /* + * http://jsdo.it/esukei/imOL + * IE8でのfilter:alpha継承 + * IE8でfilter:alphaの指定がposition:relative,position:absoluteの子要素に継承されない問題 + */ if( f ){ - if( 0 <= memory ){ - that[ '_css' ].opacity = memory; - } else { - delete that[ '_css' ].opacity; - if( X_Object_isEmpty( that[ '_css' ] ) ) delete that[ '_css' ]; - }; + that[ '_css' ].opacity = currentOpcity; }; that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY;