OSDN Git Service

Version 0..6.127, commitUpdate after GPU_RELEASED.
authoritozyun <itozyun@user.sourceforge.jp>
Thu, 29 Jan 2015 23:38:58 +0000 (08:38 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Thu, 29 Jan 2015 23:38:58 +0000 (08:38 +0900)
0.6.x/js/01_core/16_XViewPort.js
0.6.x/js/02_dom/02_XNode.js
0.6.x/js/02_dom/03_XDomEvent.js
0.6.x/js/02_dom/05_XNodeAttr.js
0.6.x/js/02_dom/06_XNodeCSS.js
0.6.x/js/02_dom/08_XNodeSelector.js
0.6.x/js/02_dom/10_XNodeAnime.js
0.6.x/js/02_dom/22_XTreeBuilder.js

index a290fea..cdcdf72 100644 (file)
@@ -296,11 +296,11 @@ X.ViewPort = {
                        body.parent  = head.parent = html;
                        html._xnodes = [ head, body ];
                        
-                       html.appendTo = html.appendToRoot = html.before = html.after = html.clone = html.remove = html.destroy = html.prevNode = html.nextNode =
+                       html.appendTo = html.appendToRoot = html.before = html.after = html.clone = html.remove = html.destroy = html.prev = html.next =
                        html.create = html.createText = html.createAt = html.createTextAt = html.append = html.appendAt = html.empty = html.html = html.text =
-                       head.appendTo = head.appendToRoot = head.before = head.after = head.clone = head.remove = head.destroy = head.prevNode = head.nextNode =
+                       head.appendTo = head.appendToRoot = head.before = head.after = head.clone = head.remove = head.destroy =
                        head.empty = head.html = head.text =
-                       body.appendTo = body.appendToRoot = body.before = body.after = body.clone = body.remove = body.destroy = body.prevNode = body.nextNode = new Function( 'return this' );
+                       body.appendTo = body.appendToRoot = body.before = body.after = body.clone = body.remove = body.destroy = new Function( 'return this' );
 
                        X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_PRE_INIT, function(){
                                X_ViewPort_readyState = X_TEMP.SYSTEM_EVENT_XTREE;
index c3d47a9..e4c32c6 100644 (file)
@@ -5,21 +5,18 @@ var
                EXIST                  : 0x1,\r
                IN_TREE                : 0x2, // xnode が(仮想)ツリーに追加されている -> 描画の対象\r
                \r
-               ELM_NEED_INIT          : 2 <<  1,\r
-               //ELM_HAS_PARENT         : 2 <<  1,\r
-               \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
+               STYLE_IS_DISPLAY_NONE  : 2 <<  1, // display    : none          \r
+               STYLE_IS_INVISIBLE     : 2 <<  2, // visibility : hidden or opacity : 0\r
+               STYLE_IS_POS_ABSOLUTE  : 2 <<  3, // position   : absolute\r
+               STYLE_IS_NO_OVERFLOW   : 2 <<  4, // overflow   : hidden\r
+               STYLE_IS_WIDTH_LENGTH  : 2 <<  5, // width  : width() のための commitUpdate が不要\r
+               STYLE_IS_WIDTH_PCT     : 2 <<  6, // width  : width() のための commitUpdate が不要かもしれない。(親で LENGTH が指定されているなら)\r
+               STYLE_IS_HEIGHT_LENGTH : 2 <<  7, // height :\r
+               STYLE_IS_HEIGHT_PCT    : 2 <<  8, // height :\r
+               STYLE_IS_FONT_LENGTH   : 2 <<  9, // fontSize :\r
+               STYLE_IS_FONT_PCT      : 2 << 10, // fontSize :\r
+\r
+               DIRTY_POSITION         : 2 << 11, // 要素位置の変更が起こった。\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
@@ -27,23 +24,25 @@ var
                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
+               ELM_NEED_INIT          : 2 << 18,\r
+               OLD_ATTRTEXT           : 2 << 19,\r
+               OLD_CSSTEXT            : 2 << 20,\r
 \r
                // filter 要素が親子になると不具合が出るのを検出\r
-               IE_FILTER_NOW          : 2 << 20,\r
+               IE_FILTER_NOW          : 2 << 21,\r
 \r
-               GPU_WAITING            : 2 << 20, // 1:子のGPU解除待\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_WAITING            : 2 << 20, // 1:子のGPU解除待\r
+               GPU_RESERVED           : 2 << 22, // 2:GPU予約\r
+               GPU_NOW                : 2 << 23, // 3:GPU now!\r
+               GPU_RELEASE_RESERVED   : 2 << 24, // 4:GPU解除予約\r
                \r
-               IE5_DISPLAY_NONE_FIX   : X_UA.IE5 && X_UA.ActiveX ? 2 << 24 : 0,\r
+               IE4_HAS_TEXTNODE       : X_UA.IE4 ? 2 << 22 : 0,\r
+               IE4_HAS_ELEMENT        : X_UA.IE4 ? 2 << 23 : 0,\r
+               IE4_DIRTY_CHILDREN     : X_UA.IE4 ? 2 << 24 : 0,\r
+               IE4_FIXED              : X_UA.IE4 ? 2 << 25 : 0,\r
                \r
-               IE4_HAS_TEXTNODE       : X_UA.IE4 ? 2 << 20 : 0,\r
-               IE4_HAS_ELEMENT        : X_UA.IE4 ? 2 << 21 : 0,\r
-               IE4_DIRTY_CHILDREN     : X_UA.IE4 ? 2 << 22 : 0,\r
-               IE4_FIXED              : X_UA.IE4 ? 2 << 23 : 0\r
+               IE5_DISPLAY_NONE_FIX   : X_UA.IE5 && X_UA.ActiveX ? 2 << 25 : 0\r
        },\r
 \r
        X_Node_BITMASK_RESET_STYLE = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ (\r
@@ -58,7 +57,7 @@ var
                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_BitMask_IS_DIRTY = X_Node_State.DIRTY_POSITION | \r
                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
@@ -83,9 +82,12 @@ var
        \r
        X_Node_strictElmCreation    = !X_UA.MacIE && X_UA.IE5678,// && !X_UA.MacIE;\r
        \r
-       X_Node_useDocumentFragment  = 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 = false,\r
        \r
-       X_Node_displayNoneFixForIE5 = X_Node_State.IE5_DISPLAY_NONE_FIX,\r
+       X_Node_displayNoneFixForIE5 = !!X_Node_State.IE5_DISPLAY_NONE_FIX,\r
        \r
        X_Node_newByTag      = false,\r
        \r
@@ -229,13 +231,11 @@ var
                \r
                before         : X_Node_before, // remove\r
                \r
-               prevNode       : X_Node_before, // -> prev\r
+               prev           : X_Node_before,\r
                \r
                after          : X_Node_after, // remove\r
                \r
-               nextNode       : X_Node_after, // -> next\r
-               \r
-               replace        : X_Node_swap, // remove\r
+               next           : X_Node_after,\r
                \r
                swap           : X_Node_swap,\r
                \r
@@ -349,7 +349,7 @@ function X_Node_toggleInTreeFlag( xnodes, flag ){
        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
+               flag ? ( xnode._flags |= X_Node_State.IN_TREE | X_Node_State.DIRTY_POSITION ) : ( xnode._flags &= ~X_Node_State.IN_TREE & ~X_Node_State.IE5_DISPLAY_NONE_FIX );\r
                xnode._xnodes && X_Node_toggleInTreeFlag( xnode._xnodes, flag );\r
        };\r
 };\r
@@ -948,6 +948,10 @@ function X_Node_call( name /*, opt_args... */ ){
                        v = this.html();\r
                        X_Node_outerXNode = null;\r
                        return v;\r
+               case 'fontSize' :\r
+                       return X_Node_CSS_getCharSize( this );\r
+               case 'inGPU' :\r
+                       return !!( this._flags & ( X_Node_State.GPU_NOW | X_Node_State.GPU_RELEASE_RESERVED ) );\r
        };\r
        \r
        raw  = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
@@ -1058,79 +1062,109 @@ function X_Node_startUpdate( time ){
        X_ViewPort._listeners && X_ViewPort._listeners[ X.Event.AFTER_UPDATE ] && X_ViewPort.asyncDispatch( X.Event.AFTER_UPDATE );\r
 };\r
 \r
+/*\r
+ * 1. GPU_NOW の場合、これ以下の一切の更新を行わない\r
+ * 2. GPU解放予約 の場合、この要素のみ変更を行う。rAF 後にさらに更新するためフラグを立てる。\r
+ * 3. GPU予約 -> GPU\r
+ * 4. style="display:none" の場合、これ以下の変更を行わない。\r
+ * 5. ie5 非表示フラグが立っていて、親と自身の class・id によって非表示になっていて、親と自身に変更がない。accumulatedFlags を使用。\r
+ *     -> TODO これ TREE の変更を検出できない。 remove したときに 子まで X_Node_State.IE5_DISPLAY_NONE_FIXを落とす。\r
+ * 6. 要素の生成\r
+ * 7. 要素の位置のズレを補正\r
+ * 8. 更新の適用\r
+ * 9. ie5 親及び自身へのクラス・id指定で display:none になるケースがありそれを検出。\r
+ *   このままでは、生成と破棄が繰り返されてしまうので親と自身のクラス・idが変わった場合、ツリー位置の変化があった場合に再生する。\r
+ */\r
 var X_Node__commitUpdate =\r
        X_UA_DOM.W3C ?\r
                ( function( that, parentElement, nextElement, accumulatedFlags ){\r
                        var elm = that._rawObject,\r
                                xnodes, l, next;\r
 \r
-                       if( X_Node_displayNoneFixForIE5 ){\r
-                               // filter の効いている要素を含む要素は display:none が無視される。\r
-                               // filter = '' で削除はできるが、再表示時に filter が消える。 -> filter な要素を削除してしまう。\r
-                               if( that._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ){\r
-                                       elm && elm.parentNode && X_Node__actualRemove( that );\r
-                                       return nextElement;\r
-                               };\r
-                       };\r
-\r
+                       // 1. GPU 一切の更新をスキップ\r
                        if( that._flags & X_Node_State.GPU_NOW ){\r
-                               // 一切の更新をスキップ\r
-                               // return nextElement;\r
+                               console.log( '更新のskip ' + !!( that._flags & X_Node_BitMask_IS_DIRTY ) );\r
+                               that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
+                               return elm;\r
                        };\r
 \r
-                       accumulatedFlags |= that._flags;\r
-                       \r
+                       // 2. GPU解放予約\r
+                       // TODO もしかしたらこのタイミングで更新できるかも。\r
                        if( that._flags & X_Node_State.GPU_RELEASE_RESERVED ){\r
-                               // 子要素の更新をスキップ\r
-                               // 自身の更新のみ -> 更新の予約\r
-                               // X_Node_updateReservedByReleaseGPU = true;\r
-                               // xnode._flags &= X_Node_BitMask_RESET_GPU;\r
-                       } else {\r
-                               // ここへ\r
+                               console.log( 'GPU 解放 ' );\r
+                               //X_Node_updateReservedByReleaseGPU = true;\r
+                               //X_Node__updateRawNode( that, elm );\r
+                               that._flags &= X_Node_BitMask_RESET_GPU;\r
+                               //return elm;\r
                        };\r
-                       \r
-                               // 要素が存在しない、または要素の位置のズレを補正\r
-                               if( !elm || elm.parentNode !== parentElement || ( nextElement && elm.nextSibling !== nextElement ) ){\r
-                                       /*\r
-                                        * if( xnode._flags & X_Node_State.IE5_DISPLAY_NONE_FIX && ( accumulatedFlags & ( X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME ) === 0 ) ) return nextElement;\r
-                                        */\r
-                                       nextElement ?\r
-                                               parentElement.insertBefore( X_Node__actualCreate( that, false ), nextElement ) :\r
-                                               parentElement.appendChild( X_Node__actualCreate( that, false ) );\r
-                                       X_Node__afterActualCreate( that );\r
-                                       return elm || that._rawObject;\r
-                               } else\r
-                               if( ( xnodes = that._xnodes ) && ( l = xnodes.length ) ) {\r
-                                       for( ; l; ){\r
-                                               next = X_Node__commitUpdate( xnodes[ --l ], elm, next, accumulatedFlags );\r
-                                       };\r
-                               };\r
-       \r
-                               if( accumulatedFlags & X_Node_BitMask_IS_DIRTY ) delete that._fontSize;\r
-                               // ここまで\r
-\r
-                       that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
 \r
+                       // 3. GPU予約 -> GPU\r
                        if( that._flags & X_Node_State.GPU_RESERVED ){\r
-                               // xnode._flags &= X_Node_BitMask_RESET_GPU;\r
-                               // xnode._flags |= X_Node_State.GPU_NOW;\r
+                               that._flags &= X_Node_BitMask_RESET_GPU;\r
+                               that._flags |= X_Node_State.GPU_NOW;\r
                        };\r
 \r
-                       // ie5 only\r
-                       // 親及び自身へのクラス・id指定で display : none になるケースもある\r
+                       // 4. style="display:none" の場合\r
+                       if( that._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ){\r
+                               if( X_Node_displayNoneFixForIE5 ){\r
+                                       // filter の効いている要素を含む要素は display:none が無視される。\r
+                                       // filter = '' で削除はできるが、再表示時に filter が消える。 -> filter な要素を削除してしまう。                                         \r
+                                       elm && elm.parentNode && X_Node__actualRemove( that );\r
+                                       return nextElement;\r
+                               };\r
+                               elm && ( elm.style.display = 'none' );\r
+                               return elm || nextElement;\r
+                       };                              \r
+                       \r
+                       // 5. ie5 非表示fixフラグ\r
+                       accumulatedFlags |= that._flags;\r
+                       \r
+                       if( that._flags & X_Node_State.IE5_DISPLAY_NONE_FIX && ( accumulatedFlags & ( X_Node_State.DIRTY_POSITION | X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME ) === 0 ) ) return nextElement;\r
+                       \r
+                       \r
+                       // 6. 要素の生成\r
+                       if( !elm ){\r
+                               nextElement ?\r
+                                       parentElement.insertBefore( X_Node__actualCreate( that, false ), nextElement ) :\r
+                                       parentElement.appendChild( X_Node__actualCreate( that, false ) );\r
+                               return X_Node__afterActualCreate( that ) || X_Node_displayNoneFixForIE5 && nextElement; // ie5 だけこの位置で _rawObject が空の場合がある\r
+                               // X_Node__actualCreate, X_Node__afterActualCreate の処理をこちら側に。\r
+                       };\r
+                       \r
+                       // 7. 要素の位置のズレを補正\r
+                       if( elm.parentNode !== parentElement || ( nextElement && elm.nextSibling !== nextElement ) ){\r
+                               nextElement ?\r
+                                       parentElement.insertBefore( elm, nextElement ) :\r
+                                       parentElement.appendChild( elm );\r
+                       };\r
+                       that._flags &= ~X_Node_State.DIRTY_POSITION;\r
+                       \r
+                       // 8. 更新の適用\r
+                       if( accumulatedFlags & X_Node_BitMask_IS_DIRTY ) delete that._fontSize;\r
+                       \r
+                       that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
+                               \r
+                       \r
+                       // 9. ie5 only\r
+                       // 親及び自身へのクラス・id指定で display : none になるケースがありそれを検出\r
                        // 生成と破棄が繰り返されてしまう、親と自身の id, class が変わった場合だけ再生成。 accumulatedFlags & ( ID | CLASSNAME )\r
                        if( X_Node_displayNoneFixForIE5 && that._tag ){\r
                                if( elm.currentStyle.display === 'none' ){\r
                                        X_Node__actualRemove( that );\r
-                                       // X_Node_State.IE5_DISPLAY_NONE_FIX -> swap で落とす\r
+                                       that._flags |= X_Node_State.IE5_DISPLAY_NONE_FIX;\r
                                        return nextElement;                                     \r
                                } else {\r
-                                       // xnode._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX\r
+                                       that._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX;\r
                                };\r
                        };\r
                        \r
-                       console.log( that.call('outerHTML') );\r
-                       \r
+                       // 10. 子要素の更新。\r
+                       if( ( xnodes = that._xnodes ) && ( l = xnodes.length ) ) {\r
+                               for( ; l; ){\r
+                                       next = X_Node__commitUpdate( xnodes[ --l ], elm, next, accumulatedFlags );\r
+                               };\r
+                       };\r
+\r
                        return elm;\r
                }) :\r
        X_UA_DOM.IE4 ? \r
@@ -1139,7 +1173,7 @@ var X_Node__commitUpdate =
                                xnodes, l, i, dirty, mix, html, text, prev;\r
 \r
                        if( !that._tag ){\r
-                               that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
+                               that._flags & X_Node_State.DIRTY_CONTENT && X_Node__updateRawNode( that, elm );\r
                                return elm;\r
                        };\r
                        \r
@@ -1208,6 +1242,7 @@ var X_Node__commitUpdate =
                        \r
                        if( accumulatedFlags & X_Node_BitMask_IS_DIRTY ) delete that._fontSize;\r
                        \r
+                       that._flags &= ~X_Node_State.DIRTY_POSITION;\r
                        that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
                        return elm;\r
                }) :\r
@@ -1224,7 +1259,6 @@ var X_Node__updateRawNode =
 \r
                        // textNode\r
                        if( !that._tag ){\r
-                               console.log( that.parent.call('outerHTML') );\r
                                elm.data = X_String_chrReferanceTo( that._text );\r
                                that._flags &= X_Node_BitMask_RESET_DIRTY;\r
                                return;\r
@@ -1238,7 +1272,7 @@ var X_Node__updateRawNode =
                                that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE5678 ? 'className' : 'class' ) ); // className は ie7-?                         \r
                        };\r
                        \r
-                       // TODO display:none の場合、更新をスキップ\r
+                       that._tag === 'TEXTAREA' && console.log( that.call('outerHTML') );\r
                        \r
                        // attr\r
                        if( that._flags & X_Node_State.DIRTY_ATTR && ( attrs = that._newAttrs || that._attrs ) ){\r
@@ -1260,7 +1294,7 @@ var X_Node__updateRawNode =
                                                \r
                                for( k in attrs ){\r
                                        //if( X_EMPTY_OBJECT[ k ] ) continue;\r
-                                       // TODO IE では input, なぜか button, object も type の変更が出来ない、同値で置き換えようとしても不可\r
+                                       // TODO IE では input, なぜか button, object も type, name の変更が出来ない、同値で置き換えようとしても不可\r
                                        ( v = attrs[ k ] ) === undefined ?\r
                                                elm.removeAttribute( rename[ k ] || k ) :\r
                                                ( elm[ rename[ k ] || k ] = X_Node_Attr_noValue[ k ] ? k : v );\r
@@ -1307,7 +1341,7 @@ var X_Node__updateRawNode =
                 * title、className、id、lang、language には setAttribute でなく、element.id で直接読み書きできる\r
                 */     \r
                        // id\r
-                       if( that._flags & X_Node_State.DIRTY_ID ) elm.setAttribute( 'id', that._id || ( 'ie4uid' + xnode._uid ) );\r
+                       if( that._flags & X_Node_State.DIRTY_ID ) elm.setAttribute( 'id', that._id || ( 'ie4uid' + that._uid ) );\r
 \r
                        // className\r
                        if( that._flags & X_Node_State.DIRTY_CLASSNAME ){\r
@@ -1368,11 +1402,14 @@ var X_Node__updateRawNode =
  */\r
 var X_Node__actualCreate =\r
        X_UA_DOM.W3C ? (function( that, isChild ){\r
-               var elm = that._rawObject,\r
-                       xnodes, frg, i, l;\r
+               var elm = that._rawObject, xnodes, frg, i, l;\r
                \r
                if( !that._tag ){\r
-                       if( elm ) return elm;\r
+                       if( elm ){\r
+                               that._flags & X_Node_BitMask_IS_DIRTY && ( elm.data = X_String_chrReferanceTo( that._text ) );\r
+                               that._flags &= X_Node_BitMask_RESET_DIRTY;\r
+                               return elm;\r
+                       };\r
                        that._flags &= X_Node_BitMask_RESET_DIRTY;\r
                        return that._rawObject = document.createTextNode( X_String_chrReferanceTo( that._text ) );\r
                };\r
@@ -1380,7 +1417,6 @@ var X_Node__actualCreate =
                if( !elm ){\r
                        that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true );\r
 \r
-                       that._flags |= X_Node_State.ELM_NEED_INIT;\r
                        that._rawObject = elm =\r
                                X_Node_strictElmCreation ?\r
                                        document.createElement( [\r
@@ -1392,11 +1428,13 @@ var X_Node__actualCreate =
                                                        that._cssText ? ' style="' + that._cssText + '"' : '',\r
                                                '>' ].join( '' ) ) :\r
                                        document.createElement( that._tag );\r
+                       \r
+                       that._flags |= X_Node_State.ELM_NEED_INIT;      \r
                };\r
                \r
-               if( X_Node_useDocumentFragment ){\r
+               if( X_Node_documentFragment ){\r
                        if( ( xnodes = that._xnodes ) && ( l = xnodes.length ) ){\r
-                               !isChild && ( frg = X_Node_useDocumentFragment ).appendChild( elm );\r
+                               !isChild && ( frg = X_Node_documentFragment ).appendChild( elm );\r
                                for( i = 0; i < l; ++i ){\r
                                        elm.appendChild( X_Node__actualCreate( xnodes[ i ], true ) );\r
                                };\r
@@ -1466,25 +1504,43 @@ var X_Node__afterActualCreate =
                var elm = that._rawObject, xnodes, l, i, v;\r
                \r
                if( !that._tag ){\r
-                       that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
-                       return that;\r
+                       elm.UID = that._uid;\r
+                       return elm;\r
                };\r
                \r
                xnodes = that._xnodes;\r
                l      = xnodes && xnodes.length;\r
 \r
+               that._flags &= ~X_Node_State.DIRTY_POSITION;\r
+\r
+               // ie5 では、documentFragment が無いため、この位置で要素はこれのみ。\r
+               if( X_Node_displayNoneFixForIE5 ){\r
+                       that._flags & X_Node_State.ELM_NEED_INIT || ( that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm ) );\r
+                       \r
+                       if( elm.currentStyle.display === 'none' ){\r
+                               X_Node__actualRemove( that );\r
+                               that._flags |= X_Node_State.IE5_DISPLAY_NONE_FIX;\r
+                               return;\r
+                       } else {\r
+                               that._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX;\r
+                       };\r
+               };\r
+\r
                // src の onload があるので先ではないか?\r
                // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
                X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
-               \r
+\r
                if( that._flags & X_Node_State.ELM_NEED_INIT ){\r
-                       if( !X_Node_useDocumentFragment ){// docFrg が使えない場合、doc 追加後に子を追加 TODO ie の場合この順序(メモリリーク対策)、他のブラウザは 子が先が有利では?\r
+                       that._flags ^= X_Node_State.ELM_NEED_INIT;\r
+                       \r
+                       if( !X_Node_documentFragment ){// docFrg が使えない場合、doc 追加後に子を追加 TODO ie の場合この順序(メモリリーク対策)、他のブラウザは 子が先が有利では?\r
                                for( i = 0; i < l; ++i ){\r
                                        elm.appendChild( X_Node__actualCreate( xnodes[ i ], true ) );\r
                                };\r
-                       };\r
+                       };                      \r
                        \r
                        if( X_Node_strictElmCreation ){\r
+                               // TODO src 等の設定\r
                                if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
                                        // doc 追加後に filter を指定しないと有効にならない。\r
                                        elm.style.filter = v = X_Node_CSS_objToIEFilterText( that );\r
@@ -1494,8 +1550,10 @@ var X_Node__afterActualCreate =
                                                that._flags &= ~X_Node_State.IE_FILTER_NOW;\r
                                        };\r
                                };\r
+                               delete that._newAttrs;\r
                                that._flags &= X_Node_BitMask_RESET_DIRTY;\r
                        } else {\r
+                               console.log();\r
                                elm.UID = that._uid;\r
                                that._newAttrs = that._attrs;\r
                                that._flags |= X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME | X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_CSS | X_Node_State.DIRTY_IE_FILTER;\r
@@ -1509,8 +1567,6 @@ var X_Node__afterActualCreate =
                                        };\r
                                };\r
                        };\r
-                       \r
-                       that._flags ^= X_Node_State.ELM_NEED_INIT;\r
                } else {\r
                        that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
                };\r
@@ -1519,6 +1575,7 @@ var X_Node__afterActualCreate =
                        X_Node__afterActualCreate( xnodes[ i ] );\r
                };\r
 \r
+               return elm;\r
        }) :\r
        X_UA_DOM.IE4 ? (function( that ){\r
                var xnodes, i, v;\r
index 3910b6f..e77dbef 100644 (file)
@@ -252,7 +252,6 @@ if( !X_UA.IE || 9 <= X_UA.IE ){
                this.currentTarget = xnode; // xnode\r
                this.eventPhase    = e.eventPhase;\r
                this.detail        = e.detail;\r
-               \r
        };\r
 } else {\r
        X.Dom.Event = function( e, xnode, element ){\r
index fb7e9a6..20e915b 100644 (file)
@@ -67,7 +67,7 @@ X_Node_Attr_renameForTag = {};
        // 動的に生成した input 要素を文書ツリーに挿入する前に設定した checked 属性は反映されず、defaultChecked だと反映される\r
        // ロードイベントを拾うために、要素生成時にネットワーク関連の属性を設定しない。\r
        //  -> src (img, iframe, ), link の href, <param name="movie" src=>\r
-function X_Node_Attr_objToAttrText( that, skipNetwork ){\r
+function X_Node_Attr_objToAttrText( that, skipNetwork, escape ){ // TODO value の escape " -> &quot;\r
        var obj     = that._attrs,\r
                noValue = X_Node_Attr_noValue,\r
                attrs   = [ '' ], // 先頭にスペース\r
@@ -106,11 +106,11 @@ function X_Node_Attr_objToAttrText( that, skipNetwork ){
 \r
                attrs[ ++n ] = noValue[ k ] ? k : [\r
                        k, '="',\r
-                       k === 'value' ? X.String.toChrReferance( obj[ k ] ) : obj[ k ],\r
+                       k === 'value' ? X_String_toChrReferance( obj[ k ] ) : obj[ k ],\r
                        '"' ].join( '' );\r
        };\r
        \r
-       //if( hasNetwork ) that._flags |= X_Node_State.\r
+       //if( hasNetwork ) that._flags |= X_Node_State.IE_NETWORK_ATTR\r
        \r
        if( 0 < n ){\r
                return that._attrText = attrs.join( ' ' );\r
@@ -240,7 +240,7 @@ function X_Node_Attr_setAttr( that, attrs, newAttrs, name, v ){
        \r
        if( v == null ){\r
                newAttrs[ name ] = undefined;\r
-               if( attrs.hasOwnProperty( name ) ) delete attrs[ name ];\r
+               if( X_Object_inObject( name, attrs ) ) delete attrs[ name ];\r
        } else {\r
                newAttrs[ name ] = attrs[ name ] = v;\r
        };\r
index d47ca8a..674212a 100644 (file)
@@ -302,7 +302,8 @@ X_Node_CSS_FILTER_FIX_PROPS =
                {
                        opacity    : 2,
                        boxShadow  : 3,
-                       textShadow : 4
+                       textShadow : 4,
+                       transform  : 5
                } :
        X_UA.ActiveX && X_UA.IE9 ? // == 9
                {
@@ -403,8 +404,11 @@ function X_Node_CSS_objToIEFilterText( that, opt_css ){
                                //glow(Color=yellow,Strength=10);
                                //どうやらCSSのbackgroundプロパティと同時に使えないようです。 s
                                break;
-                       case 5 : //'backgroundImage' :
+                       case 6 : //'backgroundImage' :
                                //
+                       
+                       case 5 : // transform scale, matrix
+                               
                };
        };
        return filters.join( ' ' );
@@ -654,7 +658,7 @@ X_Node_CSS_getCharSize =
                        return that._fontSize = parseFloat( X_node_CSS_getComputedStyle( that._rawObject, null ).fontSize );
                }) :
 
-       5.5 <= X_UA.IE ?
+       5 <= X_UA.IE ?
                (function( that ){
                        var font, vu, v, u, _v;
                        X_Node_updateTimerID && X_Node_startUpdate();
index 7d18c8b..5819d93 100644 (file)
@@ -319,7 +319,7 @@ function X_Node_Selector__parse( query, last ){
                                // > TagName|*\r
                                case 2 :\r
                                        for( ; i < l; ++i ){\r
-                                               for( xnode = parents[ i ].firstChild(); xnode; xnode = xnode.nextNode() ){\r
+                                               for( xnode = parents[ i ].firstChild(); xnode; xnode = xnode.next() ){\r
                                                        if( xnode._tag && ( isAll || tagName === xnode._tag ) ) xnodes[ ++n ] = xnode;\r
                                                };                              \r
                                        };\r
@@ -327,7 +327,7 @@ function X_Node_Selector__parse( query, last ){
                                // + TagName|*\r
                                case 3 :\r
                                        for( ; i < l; ++i ){\r
-                                               for( xnode = parents[ i ].nextNode(); xnode; xnode = xnode.nextNode() ){\r
+                                               for( xnode = parents[ i ].next(); xnode; xnode = xnode.next() ){\r
                                                        if( xnode._tag ){\r
                                                                if( isAll || tagName === xnode._tag ) xnodes[ ++n ] = xnode;\r
                                                                break;\r
@@ -339,7 +339,7 @@ function X_Node_Selector__parse( query, last ){
                                case 4 :\r
                                        merge  = {};\r
                                        for( ; i < l; ++i ){\r
-                                               for( xnode = parents[ i ].nextNode(); xnode; xnode = xnode.nextNode() ){\r
+                                               for( xnode = parents[ i ].next(); xnode; xnode = xnode.next() ){\r
                                                        if( xnode._tag && ( isAll || tagName === xnode._tag ) ){\r
                                                                uid = xnode._uid;\r
                                                                if( merge[ uid ] ){\r
@@ -578,7 +578,7 @@ function X_Node_Selector__parse( query, last ){
                        tagName = flag_all || xnode._tag;\r
                        tmp     = null;\r
                        if( /* tmp === null && */ type <= 0 ){\r
-                               for( node = xnode.prevNode(); node; node = node.prevNode() ){\r
+                               for( node = xnode.prev(); node; node = node.prev() ){\r
                                        if( node._tag && ( flag_all || tagName === node._tag ) ){\r
                                                tmp = false;\r
                                                break;\r
@@ -586,7 +586,7 @@ function X_Node_Selector__parse( query, last ){
                                };\r
                        };\r
                        if( tmp === null && 0 <= type ){\r
-                               for( node = xnode.nextNode(); node; node = node.nextNode() ){\r
+                               for( node = xnode.next(); node; node = node.next() ){\r
                                        if( node._tag && ( flag_all || tagName === node._tag ) ){\r
                                                tmp = false;\r
                                                break;\r
@@ -666,16 +666,16 @@ var X_Node_Selector__filter = {
                m : function( flags, xnodes ){ return X_Node_Selector__funcSelectorChild( 0, false, flags, xnodes ); }\r
        },\r
        'nth-child' : {\r
-               m : function( flags, xnodes, a, b ){ return X_Node_Selector__funcSelectorNth( 'firstChild', 'nextNode', true, flags, xnodes, a, b ); }\r
+               m : function( flags, xnodes, a, b ){ return X_Node_Selector__funcSelectorNth( 'firstChild', 'next', true, flags, xnodes, a, b ); }\r
        },\r
        'nth-last-child' : {\r
-               m : function( flags, xnodes, a, b ){ return X_Node_Selector__funcSelectorNth( 'lastChild', 'prevNode', true, flags, xnodes, a, b ); }\r
+               m : function( flags, xnodes, a, b ){ return X_Node_Selector__funcSelectorNth( 'lastChild', 'prev', true, flags, xnodes, a, b ); }\r
        },\r
        'nth-of-type' : {\r
-               m : function( flags, xnodes, a, b ){ return X_Node_Selector__funcSelectorNth( 'firstChild', 'nextNode', false, flags, xnodes, a, b ); }\r
+               m : function( flags, xnodes, a, b ){ return X_Node_Selector__funcSelectorNth( 'firstChild', 'next', false, flags, xnodes, a, b ); }\r
        },\r
        'nth-last-of-type' : {\r
-               m : function( flags, xnodes, a, b ){ return X_Node_Selector__funcSelectorNth( 'lastChild', 'prevNode', false, flags, xnodes, a, b ); }\r
+               m : function( flags, xnodes, a, b ){ return X_Node_Selector__funcSelectorNth( 'lastChild', 'prev', false, flags, xnodes, a, b ); }\r
        },\r
        empty : {\r
                m : function( flags, xnodes ){\r
index becf088..463080a 100644 (file)
@@ -82,6 +82,8 @@ var X_Node_ANIMATIONS            = [],
  * TODO : rotate, ActiveX transform -> 位置補正のために size 情報が必要なので、commitUpdate 後に計算して適用\r
  * TODO : matrix\r
  * TODO : skew\r
+ * TODO : filter\r
+ * TODO 前回位置からの継続\r
  */\r
 Node.prototype.animate = function( start, dest, duration, easing, wait ){\r
        var isNew = !this._anime,\r
@@ -285,6 +287,7 @@ function X_Node_Anime_updateAnimation( xnode ){
                                transitionDelay          : '0s' // 0.001 にすると transitionend のタイミングが狂う、、、\r
                        });\r
                        \r
+                       console.log( '開始位置 ' + phase );\r
                        X_Node_Anime_updatePosition( xnode, obj.startX, obj.startY, obj.startA, phase === 8 );\r
                        \r
                        xnode.dispatch( { type : X.Event.ANIME_START, gpu : phase === 8 } );\r
@@ -301,8 +304,9 @@ function X_Node_Anime_updateAnimation( xnode ){
                                        transitionDuration : obj.duration + 'ms'\r
                                });\r
                                \r
+                               console.log( '修了位置 ' + phase );\r
                                X_Node_Anime_updatePosition( xnode, obj.destX, obj.destY, obj.destA, obj.gpuParent );\r
-                               obj.phase = 2;  \r
+                               obj.phase = 2;\r
                                break;\r
                        };\r
                        console.log( 'duration = 0 の場合、アニメーションの解除' );\r
@@ -472,9 +476,10 @@ function X_Node_Anime_updatePosition( xnode, x, y, opacity, useGPU ){
                        xnode._flags &= X_Node_BitMask_RESET_GPU;\r
                        xnode._flags |= X_Node_State.GPU_NOW;\r
                } else\r
-               if( xnode._flags & X_Node_State.GPU_NOW === 0 ){\r
+               if( xnode._flags & X_Node_State.GPU_NOW ){\r
+               } else {\r
                        xnode._flags &= X_Node_BitMask_RESET_GPU;\r
-                       xnode._flags |= X_Node_State.GPU_RESERVED;                      \r
+                       xnode._flags |= X_Node_State.GPU_RESERVED;\r
                };\r
        } else {\r
                if( xnode._flags & X_Node_State.GPU_NOW ){\r
@@ -485,7 +490,6 @@ function X_Node_Anime_updatePosition( xnode, x, y, opacity, useGPU ){
                        xnode._flags &= X_Node_BitMask_RESET_GPU;\r
                };\r
        };\r
-\r
 };\r
 \r
 function X_Node_Anime_updateAnimationsNoTransition(){\r
index 063ada6..b7455e3 100644 (file)
@@ -407,8 +407,8 @@ X_TEMP.bindElementToXnode =
                                                break;\r
                                        };\r
                                        alert(  parent._tag + ' > ' + '"' + xnode._text + '" !== ' + tag + '\n' +\r
-                                               'prev : ' + ( xnode.prevNode() && xnode.prevNode().html() ) + '\n' +\r
-                                               'next : ' + ( xnode.nextNode() && xnode.nextNode().html() ) + '\n' +\r
+                                               'prev : ' + ( xnode.prev() && xnode.prev().html() ) + '\n' +\r
+                                               'next : ' + ( xnode.next() && xnode.next().html() ) + '\n' +\r
                                                'html : ' + elm.outerHTML );\r
                                        break;\r
                                };\r