OSDN Git Service

Version 0.6.107, cleanup X.NodeCSS, fix X.Node.Event for touch, add unescape for...
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 02_XNode.js
index db20195..525eb81 100644 (file)
@@ -4,21 +4,21 @@ var
                CHILD_IS_DIRTY   :  1,\r
                ID               :  2, // width, height, x, y\r
                CONTENT          :  4, // width, height, x, y textNode の内容\r
-               CLASSNAME        :  8, // _getCharSize, width, height, x, y\r
-               ATTR             : 16, // _getCharSize, width, height, x, y\r
-               CSS              : 32, // _getCharSize, width, height, x, y\r
-               IE_FILTER        : X.UA.IE < 9 && !X.UA.MacIE ? 64 : 0,\r
+               CLASSNAME        :  8, // X_Node_CSS_getCharSize, width, height, x, y\r
+               ATTR             : 16, // X_Node_CSS_getCharSize, width, height, x, y\r
+               CSS              : 32, // X_Node_CSS_getCharSize, width, height, x, y\r
+               IE_FILTER        : X_UA.IE < 9 && !X_UA.MacIE ? 64 : 0,\r
                UNKNOWN_TAG_FIX  : 128,\r
                IE4_TEXTNODE_FIX : 256\r
        },\r
        \r
        X_Node_State = {\r
                DESTROYED          : 0,\r
-               EXIST              : 1,\r
-               BELONG_TREE        : 2,\r
-               DISPLAY_NONE       : 4,\r
-               DISPLAY_BLOCK      : 8,\r
-               DISPLAY_INLINE     : 16,\r
+               EXIST              : 1, // XNODE_EXIDT, ELEMENT_EXIST\r
+               BELONG_TREE        : 2, // HAS_PARENT, HAS_PARENT_ACTUAL, BELONG_TREE, BELONG_TREE_ACTUAL\r
+               DISPLAY_NONE       : 4, // VISIVILITY_HIDDEN(opacity0), DISPALY_NONE\r
+               DISPLAY_BLOCK      : 8, // remove\r
+               DISPLAY_INLINE     : 16,// remove\r
                POSITION_ABSOLUTE  : 32,\r
                OVERFLOW_HIDDEN    : 64,\r
                HAS_WIDTH_LENGTH   : 128,\r
@@ -26,7 +26,7 @@ var
                HAS_HEIGHT_LENGTH  : 512,\r
                HAS_HEIGHT_PERCENT : 1024,\r
                IE4_ONLY_TEXT      : 2048,\r
-               IE5_DISPLAY_NONE_FIX : !X.UA.MacIE && X.UA.IE5 ? 4096 : 0 // filterがかかっていると不可? MacIE5.2- は ?\r
+               IE5_DISPLAY_NONE_FIX : !X_UA.MacIE && X_UA.IE5 ? 4096 : 0 // filterがかかっていると不可? MacIE5.2- は ?\r
        },\r
        \r
        X_Node_TYPE = {\r
@@ -42,15 +42,17 @@ var
                IMAGE       : 10\r
        },\r
        \r
-       X_Node_strictElmCreation = !X.UA.MacIE && X.UA.IE5678,// && !X.UA.MacIE;\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_useDocumentFragment = document.createDocumentFragment && ( !X_UA.IE || 5.5 <= X_UA.IE ) && document.createDocumentFragment(),\r
        \r
-       X_Node_newByTag  = false,\r
+       X_Node_newByTag      = false,\r
        \r
-       X_Node_newByText = false,\r
+       X_Node_newByText     = false,\r
        \r
-       X_Node_outerXNode = null,\r
+       X_Node_outerXNode    = null,\r
+       \r
+       X_Node_updateTimerID = 0,\r
 /*\r
  * Node( rawElement | rawTextnode | htmlString | textString )\r
  */    \r
@@ -67,7 +69,7 @@ var
                _rawObject : null,\r
                _rect      : null, // \r
                \r
-               _root      : null, // xnode が文書ツリーに属しているか?はこれを見る\r
+               _root      : null, // xnode が文書ツリーに属しているか?はこれを見る -> state\r
                parent     : null, // remove された枝も親子構造は維持している。\r
                _xnodes    : null,\r
        \r
@@ -95,10 +97,10 @@ var
                        var css, xnodes, xnode, parent, uid = X_Node_CHASHE.length;\r
                        \r
                        if( X_Node_newByTag ){\r
-                               X_Node_newByTag  = false;\r
+                               X_Node_newByTag = false;\r
                                this._tag       = v.toUpperCase();\r
                                this._xnodeType = 1;\r
-                               this._state     = X_Node_State.DISPLAY_INLINE; // todo\r
+                               this._state     = X_Node_State.DISPLAY_INLINE; // TODO\r
                                arguments[ 1 ] && this.attr( arguments[ 1 ] );\r
                                css = arguments[ 2 ];\r
                                css && this[ X.Type.isString( css ) ? 'cssText' : 'css' ]( css );\r
@@ -122,10 +124,10 @@ var
                                                if( xnode = X_Node_getXNode( v ) ) return xnode;\r
                                                // v.parentNode || v.parentElement : dom1 || dom0\r
                                                this.parent     = ( parent = v.parentNode || v.parentElement ) && parent.tagName /* ie7- */ && X_Node_getXNode( parent );\r
-                                               this._root      = this.parent ? this.parent._root : null;\r
+                                               if( this.parent && this.parent._root ) this._root = this.parent._root;\r
                                                this._rawObject = v;\r
                                                this._xnodeType = 1;\r
-                                               this._state     = X_Node_State.DISPLAY_BLOCK; // todo\r
+                                               this._state     = X_Node_State.DISPLAY_BLOCK; // TODO\r
                                                this._tag       = v.tagName.toUpperCase();\r
                                                this._id        = v.id;\r
                                                this._className = v.className;\r
@@ -143,7 +145,7 @@ var
                                        case X_Node_TYPE.RAW_TEXT :\r
                                                if( xnode = X_Node_getXNode( v ) ) return xnode;\r
                                                this.parent     = X_Node_getXNode( v.parentNode );\r
-                                               this._root      = this.parent ? this.parent._root : null;\r
+                                               if( this.parent && this.parent._root ) this._root = this.parent._root;\r
                                                this._rawObject = v;\r
                                                this._xnodeType = 3;\r
                                                this._state     = X_Node_State.DISPLAY_INLINE;\r
@@ -270,7 +272,7 @@ function X_Node_getXNode( v ){
                        };\r
                        return v.UID && X_Node_CHASHE[ v.UID ];\r
                case X_Node_TYPE.WINDOW :\r
-                       return X.ViewPort;\r
+                       return X_ViewPort;\r
                case X_Node_TYPE.DOCUMENT :\r
                        return X_ViewPort_document;\r
                case X_Node_TYPE.RAW_TEXT :\r
@@ -831,7 +833,7 @@ function X_Node_html( html ){
                return this._text;\r
        };\r
        \r
-       if( this._dirty & X_Node_Dirty.CSS && !( this._cssText = X_Node_CSS_objToCssText( this._css ) ) ){\r
+       if( this._dirty & X_Node_Dirty.CSS && !( this._cssText = X_Node_CSS_objToCssText( this ) ) ){\r
                delete this._cssText;\r
        };\r
        html = !X_Node_outerXNode ? [] : [\r
@@ -960,23 +962,22 @@ function X_Node_each( func /*, opt_args */ ){
  */\r
        \r
 function X_Node_reserveUpdate(){\r
-       var root = X_Node_body;\r
-       if( root && !root._updateTimerID ) root._updateTimerID = X.Timer.requestFrame( X_Node_startUpdate );\r
+       if( !X_Node_updateTimerID ) X_Node_updateTimerID = X.Timer.requestFrame( X_Node_startUpdate );\r
 };\r
 \r
 function X_Node_startUpdate(){\r
        var removal, i, xnode, tmp;\r
-       if( X_ViewPort_readyState < X_TEMP.SYSTEM_EVENT_INIT ){\r
-               return;\r
-       };\r
-       if( X_Node_body._updateTimerID ){\r
-               X.Timer.cancelFrame( X_Node_body._updateTimerID );\r
-               X_Node_body._updateTimerID = 0;\r
-       } else {\r
+       \r
+       if( !X_Node_updateTimerID || X_ViewPort_readyState < X_TEMP.SYSTEM_EVENT_INIT ){\r
                return;\r
        };\r
+\r
+       X.Timer.cancelFrame( X_Node_updateTimerID );\r
+       X_Node_updateTimerID = 0;\r
+\r
+\r
        // このイベントでサイズを取ると無限ループに\r
-       // X_ViewPort._listeners && X_ViewPort._listeners[ X.Event.BEFORE_UPDATE ] && X_ViewPort.dispatch( X.Dom.Event.BEFORE_UPDATE );\r
+       X_System._listeners && X_System._listeners[ X.Event.BEFORE_UPDATE ] && X_System.dispatch( X.Event.BEFORE_UPDATE );\r
 \r
        removal = X_Node_reserveRemoval;\r
        \r
@@ -1000,6 +1001,8 @@ function X_Node_startUpdate(){
        \r
        //console.log( 'end of _startUpdate().' );\r
        \r
+       X_System._listeners && X_System._listeners[ X.Event.UPDATED ] && X_System.dispatch( X.Event.UPDATED );\r
+       \r
        X_ViewPort._listeners && X_ViewPort._listeners[ X.Event.AFTER_UPDATE ] && X_ViewPort.asyncDispatch( X.Event.AFTER_UPDATE );\r
        //this._rawObject.style.visibility = tmp;\r
 };\r
@@ -1033,9 +1036,6 @@ var X_Node__commitUpdate =
                                                frg.appendChild( X_Node__actualCreate( xnodes[ i ], true ) );\r
                                        };\r
                                        elm.appendChild( frg );\r
-                                       for( i = 0; i < l; ++i ){\r
-                                               X_Node__actualCreate( xnodes[ i ], true );\r
-                                       };\r
                                } else {*/\r
                                        for( ; l; ){\r
                                                next = X_Node__commitUpdate( xnodes[ --l ], elm, next );\r
@@ -1114,7 +1114,7 @@ var X_Node__updateRawNode =
                        };\r
                        // className\r
                        if( that._dirty & X_Node_Dirty.CLASSNAME ){\r
-                               that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X.UA.IE5678 ? 'className' : 'class' ) ); // className は ie7-?                         \r
+                               that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE5678 ? 'className' : 'class' ) ); // className は ie7-?                         \r
 \r
                                // ie5 only\r
                                if( X_Node_State.IE5_DISPLAY_NONE_FIX && elm.currentStyle.display === 'none' ){\r
@@ -1123,11 +1123,12 @@ var X_Node__updateRawNode =
                                        return;\r
                                };\r
                        };\r
+                       \r
                        // style\r
                        // TODO display:none の場合、更新をスキップ\r
                        if( that._dirty & X_Node_Dirty.CSS ){\r
-                               if( that._cssText !== null || ( that._cssText = X_Node_CSS_objToCssText( that._css ) ) ){\r
-                                       X.UA.Opera78 || X.UA.NN6 ?\r
+                               if( that._cssText !== null || ( that._cssText = X_Node_CSS_objToCssText( that ) ) ){\r
+                                       X_UA.Opera78 || X_UA.NN6 ?\r
                                                elm.setAttribute( 'style', that._cssText ) : // opera8用\r
                                                ( elm.style.cssText = that._cssText );\r
                                } else {\r
@@ -1138,7 +1139,7 @@ var X_Node__updateRawNode =
                        };\r
                        \r
                        if( that._dirty & X_Node_Dirty.IE_FILTER ){\r
-                               elm.style.filter = X_Node_CSS_SPECIAL_FIX( that._css );\r
+                               elm.style.filter = X_Node_CSS_objToIEFilterText( that );;\r
                        };\r
                        \r
                        // attr\r
@@ -1146,7 +1147,7 @@ var X_Node__updateRawNode =
                        if( that._dirty & X_Node_Dirty.ATTR && ( attrs = that._newAttrs || that._attrs ) ){\r
                                rename = X_Node_Attr_renameForDOM;\r
                                for( k in attrs ){\r
-                                       if( !X.UA.MacIE && ( X.UA.IE5 || X.UA.IE55 ) ){ // IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので\r
+                                       if( !X_UA.MacIE && ( X_UA.IE5 || X_UA.IE55 ) ){ // IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので\r
                                                if( that._tag === 'TEXTAREA' && k === 'value' ){\r
                                                        elm.firstChild ?\r
                                                                ( elm.firstChild.data = attrs[ k ] ) :\r
@@ -1189,7 +1190,7 @@ var X_Node__updateRawNode =
                        };\r
                        // style\r
                        if( that._dirty & X_Node_Dirty.CSS ){\r
-                               if( that._cssText !== null || ( that._cssText = X_Node_CSS_objToCssText( that._css ) ) ){\r
+                               if( that._cssText !== null || ( that._cssText = X_Node_CSS_objToCssText( that ) ) ){\r
                                        elm.style.cssText = that._cssText;\r
                                } else {\r
                                        elm.style.cssText = '';\r
@@ -1199,7 +1200,7 @@ var X_Node__updateRawNode =
                        };\r
                        \r
                        if( that._dirty & X_Node_Dirty.IE_FILTER ){\r
-                               that._rawObject.style.filter = X_Node_CSS_SPECIAL_FIX( that._css );\r
+                               that._rawObject.style.filter = X_Node_CSS_objToIEFilterText( that );;\r
                        };\r
                        \r
                        // attr\r
@@ -1208,9 +1209,9 @@ var X_Node__updateRawNode =
                                for( k in attrs ){\r
                                        ( v = attrs[ k ] ) === undefined ?\r
                                                elm.removeAttribute( rename[ k ] || k ) :\r
-                                       that._tag === 'TEXTAREA' && k === 'value' ?\r
-                                               ( elm.innerText = v ) :\r
-                                               elm.setAttribute( rename[ k ] || k, X_Node_Attr_noValue[ k ] ? k : v ); // TODO X_Node_Attr_noValue[ k ] ? k : v\r
+                                       //that._tag === 'TEXTAREA' && k === 'value' ?\r
+                                       //      ( elm.innerText = v ) :\r
+                                               elm.setAttribute( rename[ k ] || k, X_Node_Attr_noValue[ k ] ? k : v );\r
                                };\r
                                delete that._newAttrs;\r
                        };\r
@@ -1248,7 +1249,7 @@ var X_Node__actualCreate =
                };\r
                \r
                if( !elm ){\r
-                       if( that._dirty & X_Node_Dirty.CSS && !( that._cssText = X_Node_CSS_objToCssText( that._css ) ) ){\r
+                       if( that._dirty & X_Node_Dirty.CSS && !( that._cssText = X_Node_CSS_objToCssText( that ) ) ){\r
                                delete that._cssText;\r
                        };\r
                        that._isNew = true;\r
@@ -1286,7 +1287,7 @@ var X_Node__actualCreate =
                } else {\r
                        if( that._rawObject && !isChild ) X_Node__actualRemove( that, true );\r
                        \r
-                       if( that._dirty & X_Node_Dirty.CSS && !( that._cssText = X_Node_CSS_objToCssText( that._css ) ) ){\r
+                       if( that._dirty & X_Node_Dirty.CSS && !( that._cssText = X_Node_CSS_objToCssText( that ) ) ){\r
                                delete that._cssText;\r
                        };\r
                        \r
@@ -1342,7 +1343,7 @@ var X_Node__afterActualCreate =
                        };\r
                        if( X_Node_strictElmCreation ){\r
                                if( that._dirty & X_Node_Dirty.IE_FILTER ){\r
-                                       elm.style.filter = X_Node_CSS_SPECIAL_FIX( that._css );\r
+                                       elm.style.filter = X_Node_CSS_objToIEFilterText( that );;\r
                                };\r
                                delete that._dirty;\r
                        } else {\r
@@ -1377,7 +1378,7 @@ var X_Node__afterActualCreate =
                };\r
                // textarea への value の適用はここで\r
                if( that._dirty & X_Node_Dirty.IE_FILTER ){\r
-                       X_Node__ie4getRawNode( that ).style.filter = X_Node_CSS_SPECIAL_FIX( that._css );\r
+                       X_Node__ie4getRawNode( that ).style.filter = X_Node_CSS_objToIEFilterText( that );;\r
                };\r
                delete that._dirty;\r
                X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
@@ -1398,9 +1399,9 @@ var X_Node__actualRemove =
                        };\r
 \r
                        if( !elm ) return;\r
-                       that._xnodeType === 1 && X_EventDispatcher_toggleAllEvents( that, false );// イベントの退避\r
-                       // elm.parentNode.tagName for ie7\r
-                       if( !X.UA.MacIE ){\r
+                       that._listeners && X_EventDispatcher_toggleAllEvents( that, false );// イベントの退避\r
+                       if( !X_UA.MacIE ){\r
+                               // elm.parentNode.tagName for ie7 -> that.state & BELONG_TREE_ACTUAL\r
                                !isChild && elm.parentNode && elm.parentNode.tagName && elm.parentNode.removeChild( elm );\r
                        } else {\r
                                !isChild && elm.parentNode && elm.parentNode.tagName && X_TEMP._fixed_remove( elm, that );\r
@@ -1418,7 +1419,7 @@ var X_Node__actualRemove =
                        };\r
 \r
                        if( !elm ) return;\r
-                       that._xnodeType === 1 && X_EventDispatcher_toggleAllEvents( that, false );// イベントの退避\r
+                       that._listeners && X_EventDispatcher_toggleAllEvents( that, false );// イベントの退避\r
                        \r
                        if( X_Node_Attr_HAS_VALUE[ that._tag ] && ( !that._newAttrs || !X_Object_inObject( 'value', that._newAttrs ) ) ){\r
                                that._attrs.value = elm.value;\r
@@ -1429,3 +1430,6 @@ var X_Node__actualRemove =
                        delete that._rawObject;\r
                }) :\r
                (function(){});\r
+\r
+X_ViewPort.listenOnce( X.Event.UNLOAD, X_Node__actualRemove, [ X_Node_html, true ] );\r
+\r