OSDN Git Service

Version 0.6.202, update xnode.animate().
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 20_XNode.js
index 1656421..81c33fa 100644 (file)
@@ -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' :
@@ -1367,7 +1367,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;
@@ -1408,10 +1408,10 @@ function X_Node_startUpdate( time ){
        };
        
        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 = [] );
        };
        
        if( X_Node_updateReservedByReleaseGPU ){
@@ -1419,12 +1419,16 @@ function X_Node_startUpdate( time ){
                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,9 +1448,9 @@ function X_Node_startUpdate( time ){
  */
 var X_Node__commitUpdate =
        X_UA_DOM.W3C ?
-               ( function( that, parentElement, nextElement, accumulatedFlags, ie8opacity ){
+               ( function( that, parentElement, nextElement, accumulatedFlags, ie8opacity, xnodesIEFilterFixAfter ){
                        var elm = that[ '_rawObject' ],
-                               created, xnodes, l, next;
+                               created, xnodes, l, next, anime, v;
 
                        // 1. GPU 一切の更新をスキップ
                        if( that[ '_flags' ] & X_NodeFlags_GPU_NOW ){
@@ -1474,7 +1478,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 );
                                        };
@@ -1600,10 +1605,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, ie8opacity, xnodesIEFilterFixAfter );
                                };
                        };
 
@@ -1618,6 +1627,26 @@ 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 ? 
@@ -1647,68 +1676,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 を <font> に置き換えてあるので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 を <font> に置き換えてあるので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(){});
@@ -1795,11 +1846,11 @@ 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' ] = {};
+                               f = true;
+                               if( 0 <= memory && memory < 1 ){
+                                       //if( !that[ '_css' ] ) that[ '_css' ] = {};
                                        that[ '_css' ].opacity = ie8opacity;
                                        if( that[ '_flags' ] & X_NodeFlags_DIRTY_CSS ){
                                                that[ '_flags' ] |= X_NodeFlags_OLD_CSSTEXT;
@@ -1832,12 +1883,18 @@ 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' ];
+                                       //elm.style.filter = 'inherit';
+                                       //delete that[ '_css' ].opacity;
+                                       //if( X_Object_isEmpty( that[ '_css' ] ) ) delete that[ '_css' ];
                                };
                        };