OSDN Git Service

Version 0.6.129, fix X.Node.
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 02_XNode.js
index c3d47a9..da8f553 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
-       X_Node_displayNoneFixForIE5 = X_Node_State.IE5_DISPLAY_NONE_FIX,\r
+       // 子の生成後に リアル文書 tree に追加する\r
+       X_Node_addTreeAfterChildren = !( X.UA.IE < 9 ),\r
+       \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,179 @@ 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
+                               created, 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
+                       // 1. GPU 一切の更新をスキップ\r
+                       if( that._flags & X_Node_State.GPU_NOW ){\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
-                       if( that._flags & X_Node_State.GPU_NOW ){\r
-                               // 一切の更新をスキップ\r
-                               // return nextElement;\r
+                       // 2. GPU解放予約\r
+                       // TODO もしかしたらこのタイミングで更新できるかも。\r
+                       if( that._flags & X_Node_State.GPU_RELEASE_RESERVED ){\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
+                       // 3. GPU予約 -> GPU\r
+                       if( that._flags & X_Node_State.GPU_RESERVED ){\r
+                               that._flags &= X_Node_BitMask_RESET_GPU;\r
+                               that._flags |= X_Node_State.GPU_NOW;\r
                        };\r
 \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
+                                       if( elm && elm.parentNode ){\r
+                                               X_Node__actualRemove( that );\r
+                                       };\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.GPU_RELEASE_RESERVED ){\r
-                               // 子要素の更新をスキップ\r
-                               // 自身の更新のみ -> 更新の予約\r
-                               // X_Node_updateReservedByReleaseGPU = true;\r
-                               // xnode._flags &= X_Node_BitMask_RESET_GPU;\r
-                       } else {\r
-                               // ここへ\r
+                       if( that._flags & X_Node_State.IE5_DISPLAY_NONE_FIX ){\r
+                               if( accumulatedFlags & ( X_Node_State.DIRTY_POSITION | X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME ) === 0 ){\r
+                                       return nextElement;\r
+                               };\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
+                       // 6. 要素の生成\r
+                       if( !elm ){\r
+                               if( !that._tag ){\r
+                                       that._flags &= X_Node_BitMask_RESET_DIRTY;\r
+                                       that._rawObject = elm = document.createTextNode( X_String_chrReferanceTo( that._text ) );\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
+                               if( X_Node_strictElmCreation ){\r
+                                       that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true );\r
+               \r
+                                       that._rawObject = elm =\r
+                                               document.createElement( [\r
+                                                       '<', that._tag,\r
+                                                               ' UID="', that._uid, '"',\r
+                                                               that._id ? ' id="' + that._id + '"' : '',\r
+                                                               that._className ? ' class="' + that._className + '"' : '',\r
+                                                               that._flags & X_Node_State.OLD_ATTRTEXT ? X_Node_Attr_objToAttrText( that ) : that._attrText,\r
+                                                               that._cssText ? ' style="' + that._cssText + '"' : '',\r
+                                                       '>' ].join( '' ) );             \r
+                               } else {\r
+                                       that._rawObject = elm = document.createElement( that._tag );\r
+                               };\r
+                               \r
+                               // IE には要素追加のタイミングで起こるメモリリークがありここで追加\r
+                               if( !X_Node_addTreeAfterChildren ){\r
+                                       nextElement ?\r
+                                               parentElement.insertBefore( elm, nextElement ) :\r
+                                               parentElement.appendChild( elm );\r
+                                       //elm.UID = that._uid;\r
+                                       // src の onload があるので先ではないか?\r
+                                       // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
+                                       X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\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
+                               if( that._tag ){\r
+                                       if( X_Node_documentFragment ){\r
+                                               //( frg = X_Node_documentFragment ).appendChild( elm );\r
+                                       };\r
 \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
-                       };\r
+                                       if( X_Node_strictElmCreation ){\r
+                                               // TODO src 等の設定\r
+                                               delete that._newAttrs;\r
+                                               that._flags &= X_Node_BitMask_RESET_DIRTY;\r
+                                               that._flags |= X_Node_State.DIRTY_IE_FILTER;// doc 追加後に filter を指定しないと有効にならない。\r
+                                       } else {\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
+                                               \r
+                                               // http://outcloud.blogspot.jp/2010/09/iframe.html\r
+                                               // この問題は firefox3.6 で確認\r
+                                               if( X_UA.Gecko ){\r
+                                                       if( that._tag === 'IFRAME' && !that._attrs[ 'src' ] ){\r
+                                                               //elm.contentWindow.location.replace = elm.src = 'about:blank';\r
+                                                               that.attr( 'src', 'about:blank' );\r
+                                                       };\r
+                                               };\r
+                                       };\r
+                               };\r
+                               \r
+                               created = true;\r
+                       } else\r
+                       // 7. 要素の位置のズレを補正\r
+                       if( elm.parentNode !== parentElement || ( nextElement && elm.nextSibling !== nextElement ) ){\r
+                               nextElement ?\r
+                                       parentElement.insertBefore( elm, nextElement ) :\r
+                                       parentElement.appendChild( elm );\r
 \r
-                       // ie5 only\r
-                       // 親及び自身へのクラス・id指定で display : none になるケースもある\r
+                               if( X_Node_displayNoneFixForIE5 ) that._flags |= X_Node_State.DIRTY_POSITION;\r
+                       };\r
+                       \r
+                       that._flags & X_Node_State.DIRTY_POSITION && X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\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
+                       // currentStyle を観ていたときはエラーで停止する、alert と挟むと正常に動いて支離滅裂\r
                        if( X_Node_displayNoneFixForIE5 && that._tag ){\r
-                               if( elm.currentStyle.display === 'none' ){\r
+                               if( elm.runtimeStyle.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
+                       if( created && X_Node_addTreeAfterChildren ){\r
+                               nextElement ?\r
+                                       parentElement.insertBefore( elm, nextElement ) :\r
+                                       parentElement.appendChild( elm );\r
+                               \r
+                               X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
+                       };\r
+\r
                        return elm;\r
                }) :\r
        X_UA_DOM.IE4 ? \r
@@ -1139,10 +1243,22 @@ 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
+                       // 4. style="display:none" の場合\r
+                       if( that._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ){\r
+                               if( elm ){\r
+                                       elm.style.display = 'none';\r
+                                       if( elm.style.display !== 'none' ){ // ie4 の style は currentStyle 相当らしい、、、? div 以外への display:none が効かないので remove する。\r
+                                               X_Node__actualRemove( that );\r
+                                               return prevElement;\r
+                                       };\r
+                               };\r
+                               return elm || prevElement;\r
+                       };\r
+                       \r
                        if( !elm ){\r
                                prevElement ?\r
                                        prevElement.insertAdjacentHTML( 'AfterEnd', X_Node__actualCreate( that, false ) ) :\r
@@ -1208,6 +1324,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 +1341,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,30 +1354,43 @@ 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
-                       \r
                        // attr\r
                        if( that._flags & X_Node_State.DIRTY_ATTR && ( attrs = that._newAttrs || that._attrs ) ){\r
                                rename = X_Node_Attr_renameForDOM;\r
-                               \r
-                               // IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので\r
-                               if( !X_UA.MacIE && X_UA.IE5x && that._tag === 'TEXTAREA' && ( ( v = attrs[ 'value' ] ) || X_Object_inObject( 'value', attrs ) ) ){\r
-                                       delete attrs[ 'value' ];\r
-                                       elm.firstChild ?\r
-                                               ( elm.firstChild.data = v || '' ) :\r
-                                               elm.appendChild( document.createTextNode( v || '' ) );\r
-                               };\r
-                               // http://outcloud.blogspot.jp/2010/09/iframe.html\r
-                               // この問題は firefox3.6 で確認\r
-                               if( X_UA.Gecko && that._tag === 'IFRAME' && ( ( v = attrs[ 'src' ] ) || X_Object_inObject( 'src', attrs ) ) ){\r
-                                       elm.contentWindow.location.replace = elm.src = v || '';\r
-                                       delete attrs[ 'src' ];\r
-                               };\r
                                                \r
                                for( k in attrs ){\r
+                                       v = attrs[ k ];\r
+                                       \r
+                                       switch( that._tag + k ){\r
+                                               case 'TEXTAREAvalue' :\r
+                                                       // IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので\r
+                                                       if( !X_UA.MacIE && X_UA.IE5x ){\r
+                                                               elm.firstChild ?\r
+                                                                       ( elm.firstChild.data = v || '' ) :\r
+                                                                       elm.appendChild( document.createTextNode( v || '' ) );\r
+                                                               continue;\r
+                                                       };\r
+                                                       break;\r
+                                               \r
+                                               case 'IFRAMEsrc' :\r
+                                                       // http://outcloud.blogspot.jp/2010/09/iframe.html\r
+                                                       // この問題は firefox3.6 で確認\r
+                                                       if( X_UA.Gecko ){\r
+                                                               elm.contentWindow.location.replace = elm.src = v || '';\r
+                                                               continue;\r
+                                                       };\r
+                                                       break;\r
+                                               \r
+                                               case 'IFRAMEname' :\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
+                                       };\r
+                                       \r
                                        //if( X_EMPTY_OBJECT[ k ] ) continue;\r
-                                       // TODO IE では input, なぜか button, object も type の変更が出来ない、同値で置き換えようとしても不可\r
-                                       ( v = attrs[ k ] ) === undefined ?\r
+                                       // TODO IE では input, なぜか button, object も type, name の変更が出来ない、同値で置き換えようとしても不可\r
+                                       v === undefined ?\r
                                                elm.removeAttribute( rename[ k ] || k ) :\r
                                                ( elm[ rename[ k ] || k ] = X_Node_Attr_noValue[ k ] ? k : v );\r
                                };\r
@@ -1281,10 +1410,12 @@ var X_Node__updateRawNode =
                                };\r
                        } else\r
                        if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
-                               elm.style.filter = v = X_Node_CSS_objToIEFilterText( that );\r
+                               v = X_Node_CSS_objToIEFilterText( that );\r
                                if( v ){\r
+                                       elm.style.filter = v;\r
                                        that._flags |= X_Node_State.IE_FILTER_NOW;\r
                                } else {\r
+                                       elm.style.removeAttribute( 'filter' );\r
                                        that._flags &= ~X_Node_State.IE_FILTER_NOW;\r
                                };\r
                        };\r
@@ -1307,7 +1438,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
@@ -1322,13 +1453,14 @@ var X_Node__updateRawNode =
                                        elm.removeAttribute( 'style' );\r
                                        delete that._cssText;\r
                                };\r
-                       };\r
-                       \r
+                       } else\r
                        if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
-                               that._rawObject.style.filter = v = X_Node_CSS_objToIEFilterText( that );\r
+                               v = X_Node_CSS_objToIEFilterText( that );\r
                                if( v ){\r
+                                       elm.style.filter = v;\r
                                        that._flags |= X_Node_State.IE_FILTER_NOW;\r
                                } else {\r
+                                       elm.style.removeAttribute( 'filter' );\r
                                        that._flags &= ~X_Node_State.IE_FILTER_NOW;\r
                                };\r
                        };\r
@@ -1367,46 +1499,7 @@ var X_Node__updateRawNode =
  * document.createElement of ie4 is only for OPTION & IMAGE.\r
  */\r
 var X_Node__actualCreate =\r
-       X_UA_DOM.W3C ? (function( that, isChild ){\r
-               var elm = that._rawObject,\r
-                       xnodes, frg, i, l;\r
-               \r
-               if( !that._tag ){\r
-                       if( elm ) return elm;\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
-                       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
-                                               '<', that._tag,\r
-                                                       ' UID="', that._uid, '"',\r
-                                                       that._id ? ' id="' + that._id + '"' : '',\r
-                                                       that._className ? ' class="' + that._className + '"' : '',\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
-               if( X_Node_useDocumentFragment ){\r
-                       if( ( xnodes = that._xnodes ) && ( l = xnodes.length ) ){\r
-                               !isChild && ( frg = X_Node_useDocumentFragment ).appendChild( elm );\r
-                               for( i = 0; i < l; ++i ){\r
-                                       elm.appendChild( X_Node__actualCreate( xnodes[ i ], true ) );\r
-                               };\r
-                               return frg || elm;\r
-                       };\r
-               };\r
-               \r
-               return elm;\r
-       }) :\r
-       X_UA_DOM.IE4 ? (function( that, isChild ){\r
+       X_UA_DOM.IE4 && (function( that, isChild ){\r
                var uid = that._uid,\r
                        html, xnodes, n, i, l;\r
                \r
@@ -1414,7 +1507,7 @@ var X_Node__actualCreate =
                        html = [ '<FONT id=ie4uid', uid, ' UID="', uid, '">', that._text, '</FONT>' ];// fake textNode\r
                        delete that._rawObject;\r
                } else {\r
-                       if( /* that._rawObject && */ !isChild ) X_Node__actualRemove( that, /* true */ false );\r
+                       if( !isChild ) X_Node__actualRemove( that, /* true */ false );\r
                        \r
                        that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true );\r
                        \r
@@ -1458,69 +1551,10 @@ var X_Node__actualCreate =
                };\r
                \r
                return html.join( '' );\r
-       }) :\r
-       (function(){});\r
+       });\r
 \r
 var X_Node__afterActualCreate =\r
-       X_UA_DOM.W3C ? (function( that ){\r
-               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
-               };\r
-               \r
-               xnodes = that._xnodes;\r
-               l      = xnodes && xnodes.length;\r
-\r
-               // src の onload があるので先ではないか?\r
-               // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
-               X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
-               \r
-               if( that._flags & X_Node_State.ELM_NEED_INIT ){\r
-                       if( !X_Node_useDocumentFragment ){// docFrg が使えない場合、doc 追加後に子を追加 TODO ie の場合この順序(メモリリーク対策)、他のブラウザは 子が先が有利では?\r
-                               for( i = 0; i < l; ++i ){\r
-                                       elm.appendChild( X_Node__actualCreate( xnodes[ i ], true ) );\r
-                               };\r
-                       };\r
-                       \r
-                       if( X_Node_strictElmCreation ){\r
-                               if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
-                                       // doc 追加後に filter を指定しないと有効にならない。\r
-                                       elm.style.filter = v = X_Node_CSS_objToIEFilterText( that );\r
-                                       if( v ){\r
-                                               that._flags |= X_Node_State.IE_FILTER_NOW;\r
-                                       } else {\r
-                                               that._flags &= ~X_Node_State.IE_FILTER_NOW;\r
-                                       };\r
-                               };\r
-                               that._flags &= X_Node_BitMask_RESET_DIRTY;\r
-                       } else {\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
-                               X_Node__updateRawNode( that, elm );\r
-                               \r
-                               // http://outcloud.blogspot.jp/2010/09/iframe.html\r
-                               // この問題は firefox3.6 で確認\r
-                               if( X_UA.Gecko && that._tag === 'IFRAME' ){\r
-                                       if( !that._attrs[ 'src' ] ){\r
-                                               elm.contentWindow.location.replace = elm.src = 'about:blank'; \r
-                                       };\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
-\r
-               for( i = 0; i < l; ++i ){\r
-                       X_Node__afterActualCreate( xnodes[ i ] );\r
-               };\r
-\r
-       }) :\r
-       X_UA_DOM.IE4 ? (function( that ){\r
+       X_UA_DOM.IE4 && (function( that ){\r
                var xnodes, i, v;\r
                \r
                if( !that._tag ) return that;\r
@@ -1530,18 +1564,10 @@ var X_Node__afterActualCreate =
                                X_Node__afterActualCreate( xnodes[ --i ] );\r
                        };\r
                };\r
-               if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
-                       X_Node__ie4getRawNode( that ).style.filter = v = X_Node_CSS_objToIEFilterText( that );\r
-                       if( v ){\r
-                               that._flags |= X_Node_State.IE_FILTER_NOW;\r
-                       } else {\r
-                               that._flags &= ~X_Node_State.IE_FILTER_NOW;\r
-                       };\r
-               };\r
+               that._flags & X_Node_State.DIRTY_IE_FILTER && X_Node__updateRawNode( that, that._rawObject || X_Node__ie4getRawNode( that ) );\r
                that._flags &= X_Node_BitMask_RESET_DIRTY;\r
                X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
-       }) :\r
-       (function(){});\r
+       });\r
 \r
 var X_Node__actualRemove =\r
        X_UA_DOM.W3C ?\r
@@ -1551,6 +1577,7 @@ var X_Node__actualRemove =
                        var xnodes = that._xnodes,\r
                                elm    = that._rawObject,\r
                                child, i, l;\r
+\r
                        if( xnodes && ( l = xnodes.length ) ){\r
                                for( i = 0; i < l; ++i ){\r
                                        child = xnodes[ i ];\r
@@ -1566,8 +1593,14 @@ var X_Node__actualRemove =
                        // ちなみに elm.filters に触ると ie8 でなぜかカラム落ちが発生、、、\r
                        if( X_Node_displayNoneFixForIE5 ){\r
                                if( elm.filters && elm.filters.length ){\r
+                                       //elm.style.removeAttribute( 'filter' );\r
                                        isChild = false;\r
                                        delete that._rawObject;\r
+                                       // 破棄前に value を控える TODO checked, selected も!\r
+                                       if( X_Node_Attr_HAS_VALUE[ that._tag ] && ( !that._newAttrs || !X_Object_inObject( 'value', that._newAttrs ) ) ){\r
+                                               that._attrs.value = elm.value;\r
+                                       };\r
+                                       elm.innerHTML = '';\r
                                };\r
                        };\r
                        \r