OSDN Git Service

Version 0.6.125, bugfix X.Node.
authoritozyun <itozyun@user.sourceforge.jp>
Sun, 25 Jan 2015 12:09:50 +0000 (21:09 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Sun, 25 Jan 2015 12:09:50 +0000 (21:09 +0900)
0.6.x/js/02_dom/02_XNode.js
0.6.x/js/02_dom/04_XBoxModel.js
0.6.x/js/02_dom/06_XNodeCSS.js

index d526b36..58d523a 100644 (file)
@@ -6,6 +6,7 @@ var
                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
@@ -29,6 +30,8 @@ var
                OLD_ATTRTEXT           : 2 << 18,\r
                OLD_CSSTEXT            : 2 << 19,\r
 \r
+               IE_FILTER_NOW          : 2 << 20,\r
+\r
                GPU_WAITING            : 2 << 20,                     // 1:子のGPU解除待\r
                GPU_RESERVED           : 2 << 21,                     // 2:GPU予約\r
                GPU_NOW                : 2 << 20 | 2 << 21,           // 3:GPU now!()\r
@@ -54,7 +57,7 @@ var
                X_Node_State.STYLE_IS_FONT_PCT ),\r
 \r
        X_Node_BitMask_IS_DIRTY = \r
-               X_Node_State.DIRTY_CHILD | X_Node_State.DIRTY_CONTENT | X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME |\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
        X_Node_BitMask_RESET_DIRTY = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ X_Node_BitMask_IS_DIRTY,\r
@@ -622,12 +625,15 @@ function X_Node_remove(){
 \r
        delete this.parent;\r
        parent._xnodes.splice( parent._xnodes.indexOf( this ), 1 );\r
+       \r
        if( this._flags & X_Node_State.IN_TREE ){\r
-               this._flags ^= X_Node_State.IN_TREE;\r
+               this._flags &= ~X_Node_State.IN_TREE & ~X_Node_State.IE4_TEXTNODE_EXIST;\r
                this._xnodes && X_Node_toggleInTreeFlag( this._xnodes, false );\r
                \r
-               X_Node_reserveRemoval[ X_Node_reserveRemoval.length ] = this;\r
-               X_Node_reserveUpdate();\r
+               //if( ( elm = this._rawObject ) && elm.parentNode && elm.parentNode.tagName ){\r
+                       X_Node_reserveRemoval[ X_Node_reserveRemoval.length ] = this;\r
+                       X_Node_reserveUpdate();                 \r
+               //};\r
        };\r
        return this;\r
 };\r
@@ -661,29 +667,28 @@ function X_Node_destroy( isChild ){
        };\r
        elm && this._listeners && this.unlisten(); // イベントの退避\r
 \r
-       delete X_Node_CHASHE[ this._uid ];\r
-       delete this._flags;\r
-       \r
        if( this._flags & X_Node_State.IN_TREE ){\r
                !isChild && this.remove();\r
+               delete this._flags;\r
        } else {\r
                this.parent && this.parent._xnodes.splice( this.parent._xnodes.indexOf( this ), 1 );\r
                elm && !isChild && X_Node__actualRemove( this );\r
                this.kill();\r
        };\r
+       \r
+       delete X_Node_CHASHE[ this._uid ];\r
 };\r
 \r
-function X_Node_onKill( e ){\r
+function X_Node_onBeforeKill( e ){\r
        var elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
        \r
        delete X_Node_CHASHE[ this._uid ];\r
-       delete this._flags;\r
        \r
-       if( this._flags & X_Node_State.IN_TREE ){\r
-               this.remove();\r
-       } else {\r
-               this.parent && this.parent._xnodes.splice( this.parent._xnodes.indexOf( this ), 1 );\r
-               elm && X_Node__actualRemove( this );\r
+       this.remove();\r
+       \r
+       if( elm && elm.parentNode && elm.parentNode.tagName ){\r
+               delete this._flags;\r
+               return X.Callback.PREVENT_DEFAULT;\r
        };\r
 };\r
 \r
@@ -884,7 +889,7 @@ function X_Node_text( text ){
                \r
                if( !this._tag ){\r
                        if( this._text !== text ){\r
-                               text ? ( this._text = text ) : delete this.text;\r
+                               text ? ( this._text = text ) : delete this._text;\r
                                this._flags |= X_Node_State.DIRTY_CONTENT;                              \r
                                this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();\r
                        };\r
@@ -1016,7 +1021,7 @@ function X_Node_startUpdate( time ){
                for( ; i; ){\r
                        xnode = removal[ --i ];\r
                        X_Node__actualRemove( xnode );\r
-                       !X_Node_body._flags && xnode.kill();\r
+                       X_Node_body._flags && !xnode._flags && xnode.kill();\r
                };\r
                removal.length = 0;\r
        };\r
@@ -1040,13 +1045,15 @@ var X_Node__commitUpdate =
        X_UA_DOM.W3C ?\r
                ( function( that, parentElement, nextElement ){\r
                        var elm = that._rawObject,\r
-                               xnodes, l, i, frg, next, k, v;\r
-\r
-                       if( X_Node_displayNoneFixForIE5 && that._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ){\r
-                               // filter の効いている要素だけdisplay:none が無視される模様。filter を切ればよい?\r
-                               // 親が、display:none の場合は?\r
-                               elm && elm.parentNode && X_Node__actualRemove( that );\r
-                               return nextElement;\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
                        if( !elm || ( parentElement && elm.parentNode !== parentElement ) || ( nextElement && elm.nextSibling !== nextElement ) ){\r
@@ -1054,7 +1061,6 @@ var X_Node__commitUpdate =
                                        parentElement.insertBefore( X_Node__actualCreate( that ), nextElement ) :\r
                                        parentElement.appendChild( X_Node__actualCreate( that ) );\r
                                X_Node__afterActualCreate( that );\r
-\r
                                return elm || that._rawObject;\r
                        } else\r
                        if( ( xnodes = that._xnodes ) && ( l = xnodes.length ) ) {\r
@@ -1065,14 +1071,12 @@ var X_Node__commitUpdate =
 \r
                        delete that._fontSize;\r
 \r
-                       if( that._flags & X_Node_BitMask_IS_DIRTY ){\r
-                               X_Node__updateRawNode( that, elm );\r
-                       } else\r
-                       if( that._tag && X_Node_displayNoneFixForIE5 && elm.currentStyle.display === 'none' ){\r
-                               // TODO 親要素への変更で display:none が変わる場合もあるのでここで調べる\r
-                       };\r
-                       \r
-                       if( X_Node_displayNoneFixForIE5 && that._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ){\r
+                       that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
+\r
+                       // ie5 only\r
+                       // 親及び自身へのクラス・id指定で display : none になるケースもある\r
+                       if( X_Node_displayNoneFixForIE5 && that._tag && elm.currentStyle.display === 'none' ){\r
+                               X_Node__actualRemove( that );\r
                                return nextElement;\r
                        };\r
                        return elm;\r
@@ -1150,20 +1154,9 @@ var X_Node__updateRawNode =
                                that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE5678 ? 'className' : 'class' ) ); // className は ie7-?                         \r
                        };\r
                        \r
-                       // ie5 only\r
-                       // TODO 親へのクラス・id指定で display : none になるケースもある\r
-                       if( X_Node_displayNoneFixForIE5 && elm.currentStyle.display === 'none' ){\r
-                               X_Node__actualRemove( that );\r
-                               that._flags |= X_Node_State.STYLE_IS_DISPLAY_NONE;\r
-                               return;\r
-                       };                      \r
-                       \r
-                       if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
-                               elm.style.filter = X_Node_CSS_objToIEFilterText( that );;\r
-                       };\r
+                       // TODO display:none の場合、更新をスキップ\r
                        \r
                        // attr\r
-                       // TODO display:none の場合、更新をスキップ\r
                        if( that._flags & X_Node_State.DIRTY_ATTR && ( attrs = that._newAttrs || that._attrs ) ){\r
                                rename = X_Node_Attr_renameForDOM;\r
                                \r
@@ -1192,9 +1185,9 @@ var X_Node__updateRawNode =
                        };\r
                        \r
                        // style\r
-                       // TODO display:none の場合、更新をスキップ\r
                        if( that._flags & X_Node_State.DIRTY_CSS ){\r
                                if( that._flags & X_Node_State.OLD_CSSTEXT ? X_Node_CSS_objToCssText( that ) : that._cssText ){\r
+                                       if( !elm.style ) alert(that.call('outerHTML'));\r
                                        X_UA.Opera78 || X_UA.NN6 ?\r
                                                elm.setAttribute( 'style', that._cssText ) : // opera8用\r
                                                ( elm.style.cssText = that._cssText );\r
@@ -1203,6 +1196,15 @@ var X_Node__updateRawNode =
                                        elm.removeAttribute( 'style' );\r
                                        delete that._cssText;\r
                                };\r
+                       } else\r
+                       if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
+                               elm.style.filter = v = X_Node_CSS_objToIEFilterText( that );\r
+                               //alert( 'updateraw ' + that.call('outerHTML') );\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
                        \r
                        that._flags &= X_Node_BitMask_RESET_DIRTY;\r
@@ -1241,7 +1243,12 @@ var X_Node__updateRawNode =
                        };\r
                        \r
                        if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
-                               that._rawObject.style.filter = X_Node_CSS_objToIEFilterText( that );;\r
+                               that._rawObject.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
                        \r
                        // attr\r
@@ -1285,6 +1292,8 @@ var X_Node__actualCreate =
                if( !that._tag ){\r
                        if( elm ) return elm;\r
                        that._flags &= X_Node_BitMask_RESET_DIRTY;\r
+                       //console.log( 'create ' + that._text );\r
+                       console.log( document.createTextNode( X_String_chrReferanceTo( that._text ) ) );\r
                        return that._rawObject = document.createTextNode( X_String_chrReferanceTo( that._text ) );\r
                };\r
                \r
@@ -1303,9 +1312,6 @@ var X_Node__actualCreate =
                                                        that._cssText ? ' style="' + that._cssText + '"' : '',\r
                                                '>' ].join( '' ) ) :\r
                                        document.createElement( that._tag );\r
-                               \r
-                                       \r
-       console.log( '##' + that._attrText + '##' );\r
                };\r
                if( X_Node_useDocumentFragment ){\r
                        if( ( xnodes = that._xnodes ) && ( l = xnodes.length ) ){\r
@@ -1363,7 +1369,7 @@ var X_Node__actualCreate =
 \r
 var X_Node__afterActualCreate =\r
        X_UA_DOM.W3C ? (function( that ){\r
-               var elm = that._rawObject, xnodes, l, i;\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
@@ -1373,21 +1379,32 @@ var X_Node__afterActualCreate =
                xnodes = that._xnodes;\r
                l      = xnodes && xnodes.length;\r
                \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 追加後に子を追加\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
-                                       X_Node__afterActualCreate( xnodes[ i ] );\r
+                                       /* X_Node__afterActualCreate( xnodes[ i ] ); */\r
                                };\r
-                       } else {\r
+                       /*} else { \r
                                for( i = 0; i < l; ++i ){\r
                                        X_Node__afterActualCreate( xnodes[ i ] );\r
-                               };\r
+                               }; */\r
                        };\r
                        \r
                        if( X_Node_strictElmCreation ){\r
                                if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
-                                       elm.style.filter = X_Node_CSS_objToIEFilterText( that );;\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
@@ -1407,21 +1424,22 @@ var X_Node__afterActualCreate =
                        \r
                        that._flags ^= X_Node_State.ELM_NEED_INIT;\r
                } else {\r
-                       \r
+                       /*\r
                        for( i = 0; i < l; ++i ){\r
                                X_Node__afterActualCreate( xnodes[ i ] );\r
-                       };\r
+                       }; */\r
                        // 親要素の updateRawNode 前に子要素の updateRawNode を行う\r
-                       // 親要素が GPU レイヤーに転送されるケースがあるので、先に子要素の変更を済ませる\r
+                       // 親要素が GPU レイヤーに転送されるケースがあるので、先に子要素の変更を済ませる <- コレ間違いでは? css 設定後の script 終了後ではないか?\r
                        that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
                };      \r
 \r
-               // src の onload があるので先ではないか?\r
-               // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
-               X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
+               for( i = 0; i < l; ++i ){\r
+                       X_Node__afterActualCreate( xnodes[ i ] );\r
+               };\r
+\r
        }) :\r
        X_UA_DOM.IE4 ? (function( that ){\r
-               var xnodes, i;\r
+               var xnodes, i, v;\r
                that._flags |= X_Node_State.IE4_TEXTNODE_EXIST;\r
                \r
                if( !that._tag ) return that;\r
@@ -1432,7 +1450,12 @@ var X_Node__afterActualCreate =
                        };\r
                };\r
                if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
-                       X_Node__ie4getRawNode( that ).style.filter = X_Node_CSS_objToIEFilterText( that );;\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_BitMask_RESET_DIRTY;\r
                X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
@@ -1455,7 +1478,18 @@ var X_Node__actualRemove =
                        };\r
 \r
                        if( !elm ) return;\r
+                       \r
                        that._listeners && X_EventDispatcher_toggleAllEvents( that, false );// イベントの退避\r
+                       \r
+                       // ie5では filter の効いている要素をremove時に破棄して、再度append 時に新規生成する\r
+                       // ちなみに elm.filters に触ると ie8 でなぜかカラム落ちが発生、、、\r
+                       if( X_Node_displayNoneFixForIE5 ){\r
+                               if( elm.filters && elm.filters.length ){\r
+                                       isChild = false;\r
+                                       delete that._rawObject;\r
+                               };\r
+                       };\r
+                       \r
                        if( !X_UA.MacIE ){\r
                                // elm.parentNode.tagName for ie7\r
                                !isChild && elm.parentNode && elm.parentNode.tagName && elm.parentNode.removeChild( elm );\r
index 7c4bf3e..d89ca64 100644 (file)
@@ -64,16 +64,10 @@ X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_INIT, function(){
  * getBoundingClientRect\r
  */\r
 Node.prototype.width = function(){\r
-       if( !this.parent ){// todo : _state で tree に所属しているか?判定\r
-               console.log( 'xnode.width() : no parent' );\r
-               return 0;\r
-       };\r
+       if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        X_Node_updateTimerID && X_Node_startUpdate();\r
-       if( ( this._flags & X_Node_State.IN_TREE ) === 0 ){\r
-               console.log( 'xnode.width() : not belong tree.' );\r
-               return 0;\r
-       };\r
-       if( this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'width' );\r
                return this._rawObject.offsetWidth;\r
@@ -86,16 +80,10 @@ Node.prototype.width = function(){
 };\r
 \r
 Node.prototype.height = function(){\r
-       if( !this.parent ){\r
-               console.log( 'xnode.height() : no parent' );\r
-               return 0;\r
-       };\r
+       if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        X_Node_updateTimerID && X_Node_startUpdate();\r
-       if( ( this._flags & X_Node_State.IN_TREE ) === 0 ){\r
-               console.log( 'xnode.height() : not belong tree.' );\r
-               return 0;\r
-       };\r
-       if( this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'height' );\r
                return this._rawObject.offsetHeight;\r
@@ -108,16 +96,10 @@ Node.prototype.height = function(){
 };\r
 \r
 Node.prototype.clientWidth = function(){\r
-       if( !this.parent ){// todo : _state で tree に所属しているか?判定\r
-               console.log( 'xnode.width() : no parent' );\r
-               return 0;\r
-       };\r
+       if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        X_Node_updateTimerID && X_Node_startUpdate();\r
-       if( ( this._flags & X_Node_State.IN_TREE ) === 0 ){\r
-               console.log( 'xnode.width() : not belong tree.' );\r
-               return 0;\r
-       };\r
-       if( this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'width' );\r
                return this._rawObject.clientWidth;\r
@@ -130,16 +112,10 @@ Node.prototype.clientWidth = function(){
 };\r
 \r
 Node.prototype.clientHeight = function(){\r
-       if( !this.parent ){\r
-               console.log( 'xnode.height() : no parent' );\r
-               return 0;\r
-       };\r
+       if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        X_Node_updateTimerID && X_Node_startUpdate();\r
-       if( ( this._flags & X_Node_State.IN_TREE ) === 0 ){\r
-               console.log( 'xnode.height() : not belong tree.' );\r
-               return 0;\r
-       };\r
-       if( this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+\r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'height' );\r
                return this._rawObject.clientHeight;\r
@@ -152,16 +128,10 @@ Node.prototype.clientHeight = function(){
 };\r
 \r
 Node.prototype.scrollWidth = function(){\r
-       if( !this.parent ){// todo : _state で tree に所属しているか?判定\r
-               console.log( 'xnode.width() : no parent' );\r
-               return 0;\r
-       };\r
+       if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        X_Node_updateTimerID && X_Node_startUpdate();\r
-       if( ( this._flags & X_Node_State.IN_TREE ) === 0 ){\r
-               console.log( 'xnode.width() : not belong tree.' );\r
-               return 0;\r
-       };\r
-       if( this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+\r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'width' );\r
                return this._rawObject.scrollWidth;\r
@@ -174,18 +144,11 @@ Node.prototype.scrollWidth = function(){
 };\r
 \r
 Node.prototype.scrollHeight = function(){\r
-       if( !this.parent ){\r
-               console.log( 'xnode.height() : no parent' );\r
-               return 0;\r
-       };\r
+       if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        X_Node_updateTimerID && X_Node_startUpdate();\r
-       if( ( this._flags & X_Node_State.IN_TREE ) === 0 ){\r
-               console.log( 'xnode.height() : not belong tree.' );\r
-               return 0;\r
-       };\r
-       if( this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+\r
        if( X_UA_DOM.W3C ){\r
-               // this.css( X_Node_CSS_Unit.px, 'height' );\r
                return this._rawObject.scrollHeight;\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
@@ -196,16 +159,10 @@ Node.prototype.scrollHeight = function(){
 };\r
 \r
 Node.prototype.scrollLeft = function(){\r
-       if( !this.parent ){// todo : _state で tree に所属しているか?判定\r
-               console.log( 'xnode.scrollLeft() : no parent' );\r
-               return 0;\r
-       };\r
+       if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        X_Node_updateTimerID && X_Node_startUpdate();\r
-       if( ( this._flags & X_Node_State.IN_TREE ) === 0 ){\r
-               console.log( 'xnode.scrollLeft() : not belong tree.' );\r
-               return 0;\r
-       };\r
-       if( this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+\r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'width' );\r
                return this._rawObject.scrollLeft;\r
@@ -218,16 +175,10 @@ Node.prototype.scrollLeft = function(){
 };\r
 \r
 Node.prototype.scrollTop = function(){\r
-       if( !this.parent ){// todo : _state で tree に所属しているか?判定\r
-               console.log( 'xnode.scrollTop() : no parent' );\r
-               return 0;\r
-       };\r
+       if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        X_Node_updateTimerID && X_Node_startUpdate();\r
-       if( ( this._flags & X_Node_State.IN_TREE ) === 0 ){\r
-               console.log( 'xnode.scrollTop() : not belong tree.' );\r
-               return 0;\r
-       };\r
-       if( this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'width' );\r
                return this._rawObject.scrollTop;\r
@@ -248,22 +199,17 @@ Node.prototype.scrollTop = function(){
  */\r
 // X_Node_CSS_transform,\r
 Node.prototype.x = function(){\r
-       if( !this.parent ){\r
-               console.log( 'xnode.x() : no parent' );\r
-               return 0;\r
-       };\r
+       if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        X_Node_updateTimerID && X_Node_startUpdate();\r
-       if( ( this._flags & X_Node_State.IN_TREE ) === 0 ){\r
-               console.log( 'xnode.x() : not belong tree.' );\r
-               return 0;\r
-       };\r
-       if( this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'left' );\r
                // this.css( X_Node_CSS_Unit.px, 'translateX' );\r
                return this._rawObject.offsetLeft;\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
+               // pixelLeft http://www.din.or.jp/~hagi3/JavaScript/JSTips/DHTML/ProbIE5.htm\r
                return ( this._rawObject || X_Node__ie4getRawNode( this ) ).offsetLeft;\r
        } else {\r
                \r
@@ -271,16 +217,10 @@ Node.prototype.x = function(){
 };\r
 \r
 Node.prototype.y = function(){\r
-       if( !this.parent ){\r
-               console.log( 'xnode.y() : no parent' );\r
-               return 0;\r
-       };\r
+       if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        X_Node_updateTimerID && X_Node_startUpdate();\r
-       if( ( this._flags & X_Node_State.IN_TREE ) === 0 ){\r
-               console.log( 'xnode.y() : not belong tree.' );\r
-               return 0;\r
-       };\r
-       if( this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return 0;\r
+       \r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'top' );\r
                // this.css( X_Node_CSS_Unit.px, 'transisitonY' );\r
@@ -294,18 +234,8 @@ Node.prototype.y = function(){
 };\r
 \r
 Node.prototype.offset = function( /* xnodeParent */ ){\r
-       var x = 0, y = 0, elm;\r
-       \r
-       if( !this.parent ){\r
-               console.log( 'xnode.offset() : no parent' );\r
-               return { x : 0, y : 0 };\r
-       };\r
-       \r
-       if( ( this._flags & X_Node_State.IN_TREE ) === 0 ){\r
-               console.log( 'xnode.offset() : not belong tree.' );\r
-               return { x : 0, y : 0 };\r
-       };\r
-       if( this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return { x : 0, y : 0 };\r
+\r
+       if( ( this._flags & X_Node_State.IN_TREE ) === 0 || this._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ) return { x : 0, y : 0 };\r
        \r
        if( X.Doc.body === this || X.Doc.html === this ){\r
                return { x : 0, y : 0 };\r
@@ -314,15 +244,13 @@ Node.prototype.offset = function( /* xnodeParent */ ){
        X_Node_updateTimerID && X_Node_startUpdate();\r
        \r
        if( X_UA_DOM.W3C ){\r
-               elm = this._rawObject;\r
+               return X_Node_getPosition( this._rawObject );\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
-               elm = this._rawObject || X_Node__ie4getRawNode( this );         \r
+               return X_Node_getPosition( this._rawObject || X_Node__ie4getRawNode( this ) );\r
        } else {\r
                \r
        };\r
-       \r
-       return X_Node_getPosition( elm );\r
 };\r
 \r
 // エレメントの座標取得 ~スクロール要素~\r
index b185bdc..3f9f250 100644 (file)
@@ -254,7 +254,7 @@ function X_Node_CSS_objToCssText( that ){
        that._flags &= ~X_Node_State.OLD_CSSTEXT;
        
        if( !obj ){ // Opera7.5 未満?
-               delete that._cssText;
+               delete that._cssText;+65
                return '';
        };
        
@@ -492,21 +492,22 @@ function X_Node_CSS__splitValueAndUnit( v ){
 Node.prototype.css = function( nameOrObj /* orUnitID, valuOrUnitOrName */ ){
        var args = arguments,
                css  = this._css,
-               p, name, v, plain, camelize;
+               p, name, v, plain, camelize, flags;
        if( !this._tag ) return this;
 // setter:object
        if( X.Type.isObject( nameOrObj ) ){
                if( !css ) css = this._css = {};
                plain    = X_EMPTY_OBJECT;
                camelize = X_Node_CSS_camelize;
+               flags    = this._flags;
                for( p in nameOrObj ){
                        if( plain[ p ] ) continue;
                        name = camelize( p );
                        v    = nameOrObj[ p ];
                        if( css[ name ] === v ) continue;
-                       this._flags = X_Node_CSS_setStyle( css, this._flags, name, v );
+                       flags = X_Node_CSS_setStyle( css, flags, name, v );
                };
-               this._flags |= X_Node_State.DIRTY_CSS | X_Node_State.OLD_CSSTEXT;
+               this._flags = flags | X_Node_State.DIRTY_CSS | X_Node_State.OLD_CSSTEXT;
                this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();
                delete this._cssText;
                return this;
@@ -604,7 +605,7 @@ Node.prototype.cssText = function( v ){
                delete this._css;
                delete this._cssText;
                this._flags |= X_Node_State.DIRTY_CSS;
-               this._flags &= ~X_Node_State.OLD_CSSTEXT; // ~X_Node_State.DIRTY_IE_FILTER
+               this._flags &= ~X_Node_State.OLD_CSSTEXT | ~X_Node_State.DIRTY_IE_FILTER;
                this._flags &= X_Node_BITMASK_RESET_STYLE;
                this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();
                return this;
@@ -706,7 +707,7 @@ X_Node_CSS_getCharSize =
                                };
                        } else {
                                // 要素を生成して測定!
-                               ( that._rawObject || X_Node__ie4getRawNode( that ) ).insertAdjacentHTML( 'BeforeEnd', '<div id="ie4charsize" style="position:absolute;top:0;left:0;">X</div>' );
+                               ( that._rawObject || X_Node__ie4getRawNode( that ) ).insertAdjacentHTML( 'BeforeEnd', '<div id="ie4charsize" style="position:absolute;top:0;left:0;visivility:hidden;line-height:1;height:1em;">X</div>' );
                                elm = document.all[ 'ie4charsize' ];
                                v = elm.offsetHeight;
                                elm.removeAttribute( 'id' ); // ?