OSDN Git Service

Version 0.6.130, fix X.Net & X.Audio.
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 02_XNode.js
index da8f553..26060f5 100644 (file)
@@ -110,13 +110,14 @@ var
                _rect      : null, // \r
                _fontSize  : 0,\r
                \r
+               length     : 1,\r
                parent     : null, // remove された枝も親子構造は維持している。\r
                _xnodes    : null, // Array.<Node>\r
 \r
                _tag       : '',\r
                _text      : '',\r
-               _id        : '',\r
-               _className : '',\r
+               _id        : '', //\r
+               _className : '', //\r
 \r
                _attrs     : null, // see X_Node_Attr\r
                _newAttrs  : null,\r
@@ -131,12 +132,12 @@ var
         * TODO Node の継承ができない!\r
         */\r
                Constructor : function( v ){\r
-                       var css, xnodes, xnode, parent, uid = X_Node_CHASHE.length;\r
+                       var uid = X_Node_CHASHE.length,\r
+                               css, xnodes, xnode, parent;\r
                        \r
                        if( X_Node_newByTag ){\r
                                X_Node_newByTag = false;\r
                                this._tag       = v.toUpperCase();\r
-                               this._flags    |= X_Node_State.EXIST;\r
                                arguments[ 1 ] && this.attr( arguments[ 1 ] );\r
                                css = arguments[ 2 ];\r
                                css && this[ X.Type.isString( css ) ? 'cssText' : 'css' ]( css );\r
@@ -144,7 +145,6 @@ var
                        if( X_Node_newByText ){\r
                                X_Node_newByText = false;\r
                                this._text       = v;\r
-                               this._flags     |= X_Node_State.EXIST;\r
                        } else {\r
                                if( 1 < arguments.length ) return new X_NodeList( arguments );\r
                                if( X.Type.isArray( v ) && v.length ) return new X_NodeList( v );\r
@@ -158,11 +158,7 @@ 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
-                                               if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){\r
-                                                       this._flags |= X_Node_State.IN_TREE;\r
-                                               };\r
                                                this._rawObject = v;\r
-                                               this._flags    |= X_Node_State.EXIST;\r
                                                this._tag       = v.tagName.toUpperCase();\r
                                                this._id        = v.id;\r
                                                this._className = v.className;\r
@@ -170,7 +166,7 @@ var
                                                this.cssText( v.style.cssText );\r
                                                this._flags &= X_Node_BitMask_RESET_DIRTY; // X_Node_State.DIRTY_CSS を落とす\r
                                                \r
-                                               // TODO attr の回収は不可能、、、\r
+                                               // TODO attr の回収は不可能、、、?\r
                                                if( X_UA_DOM.IE4 ){\r
                                                        v.setAttribute( 'UID', '' + uid );\r
                                                } else {\r
@@ -182,11 +178,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
-                                               if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){\r
-                                                       this._flags |= X_Node_State.IN_TREE;\r
-                                               };\r
                                                this._rawObject = v;\r
-                                               this._flags    |= X_Node_State.EXIST;\r
                                                this._text      = v.data;\r
                                                v.UID = uid;\r
                                                break;\r
@@ -198,11 +190,16 @@ var
                                                return X_Node_none;\r
 \r
                                        default :\r
+                                               this.length = 0;\r
                                                if( X_Node_none ) return X_Node_none;\r
                                                return;\r
                                };\r
                        };\r
                        \r
+                       if( this.parent && ( this.parent._flags & X_Node_State.IN_TREE ) ){\r
+                               this._flags |= X_Node_State.IN_TREE;\r
+                       };\r
+                       this._flags |= X_Node_State.EXIST;\r
                        X_Node_CHASHE[ this._uid = uid ] = this;\r
                },\r
                \r
@@ -768,7 +765,7 @@ function X_Node_className( v ){
        \r
        // setter\r
        if( this._className === v ) return this;\r
-       if( !v || typeof v !== 'string' ){\r
+       if( !v || !X.Type.isString( v ) ){\r
                delete this._className;\r
        } else {\r
                // cleanup\r
@@ -957,6 +954,12 @@ function X_Node_call( name /*, opt_args... */ ){
        raw  = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
        if( !raw ) return;\r
        \r
+       if( name === 'scrollTo' ){\r
+               raw.scrollLeft = arguments[ 1 ] || 0;\r
+               raw.scrollTop  = arguments[ 2 ] || 0;\r
+               return;\r
+       };\r
+       \r
        func = raw[ name ];\r
        if( X.Type.isFunction( func ) ){\r
                if( l ){\r
@@ -1115,8 +1118,8 @@ var X_Node__commitUpdate =
                                        return nextElement;\r
                                };\r
                                elm && ( elm.style.display = 'none' );\r
-                               return elm || nextElement;\r
-                       };                      \r
+                               return elm.nextSibling === nextElement ? elm : nextElement;\r
+                       };\r
                        \r
                        // 5. ie5 非表示fixフラグ\r
                        accumulatedFlags |= that._flags;\r
@@ -1132,6 +1135,9 @@ var X_Node__commitUpdate =
                                if( !that._tag ){\r
                                        that._flags &= X_Node_BitMask_RESET_DIRTY;\r
                                        that._rawObject = elm = document.createTextNode( X_String_chrReferanceTo( that._text ) );\r
+                                       if( !X.UA.IE ){\r
+                                               elm.UID = that._uid;\r
+                                       };\r
                                } else\r
                                if( X_Node_strictElmCreation ){\r
                                        that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true );\r
@@ -1154,13 +1160,13 @@ var X_Node__commitUpdate =
                                        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( that._tag ){\r
+                                       // src の onload があるので先ではないか?\r
+                                       // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
+                                       X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰                                \r
+                                       \r
                                        if( X_Node_documentFragment ){\r
                                                //( frg = X_Node_documentFragment ).appendChild( elm );\r
                                        };\r
@@ -1173,6 +1179,7 @@ var X_Node__commitUpdate =
                                        } else {\r
                                                elm.UID = that._uid;\r
                                                that._newAttrs = that._attrs;\r
+                                               that._flags &= X_Node_BitMask_RESET_DIRTY;\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
@@ -1232,7 +1239,10 @@ var X_Node__commitUpdate =
                                        parentElement.insertBefore( elm, nextElement ) :\r
                                        parentElement.appendChild( elm );\r
                                \r
-                               X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
+                               if( X_UA.Gecko && that._tag === 'IFRAME' && elm.contentWindow ){\r
+                                       // tree に追加されるまで contentWindow は存在しない。\r
+                                       elm.contentWindow.location.replace = elm.src;\r
+                               };\r
                        };\r
 \r
                        return elm;\r
@@ -1256,7 +1266,7 @@ var X_Node__commitUpdate =
                                                return prevElement;\r
                                        };\r
                                };\r
-                               return elm || prevElement;\r
+                               return elm || nextElement;\r
                        };\r
                        \r
                        if( !elm ){\r
@@ -1351,7 +1361,7 @@ var X_Node__updateRawNode =
                        };\r
                        // className\r
                        if( that._flags & X_Node_State.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.IE < 8 ? 'className' : 'class' ) ); // className は ie7-                  \r
                        };\r
                        \r
                        // attr\r
@@ -1375,7 +1385,7 @@ var X_Node__updateRawNode =
                                                case 'IFRAMEsrc' :\r
                                                        // http://outcloud.blogspot.jp/2010/09/iframe.html\r
                                                        // この問題は firefox3.6 で確認\r
-                                                       if( X_UA.Gecko ){\r
+                                                       if( X_UA.Gecko && elm.contentWindow ){\r
                                                                elm.contentWindow.location.replace = elm.src = v || '';\r
                                                                continue;\r
                                                        };\r