OSDN Git Service

Version 0.6.121, iScroll5 is working on iPhone touch 1G, update X.Audio.
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 02_XNode.js
index 9c44e1d..b7bbf6f 100644 (file)
@@ -172,6 +172,11 @@ var
                        X_Node_CHASHE[ this._uid = uid ] = this;\r
                },\r
                \r
+               // attr\r
+               // css, cssText\r
+               // find\r
+               // animate, stop\r
+               \r
                create         : X_Node_create,\r
                \r
                createAt       : X_Node_createAt,\r
@@ -654,7 +659,7 @@ function X_Node_destroy( isChild ){
  */\r
 function X_Node_contains( v ){\r
        var elm, type, xnodes, i;\r
-       if( !v || this._xnodeType !== 1 ) return false;\r
+       if( !v || this._xnodeType !== 1 || this === v ) return false;\r
        // contains ie4+\r
        if( ( elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ) ) && document.contains && ( type = X_Node_getType( v ) ) && ( type === X_Node_TYPE.RAW_HTML || type === X_Node_TYPE.RAW_TEXT ) ){\r
                return elm.contains( v );       \r
@@ -665,7 +670,7 @@ function X_Node_contains( v ){
        xnodes = this._xnodes;\r
        if( !xnodes || !xnodes.length ) return false;\r
        if( xnodes.indexOf( v ) !== -1 ) return true; // fast\r
-       if( elm === v.parentNode ) return false;\r
+       if( elm === v.parentNode ) return true;\r
        for( i = xnodes.length; i; ){\r
                if( xnodes[ --i ].contains( v ) ) return true;\r
        };\r
@@ -794,8 +799,9 @@ function X_Node_hasClass( v ){
 \r
 /* --------------------------------------\r
  *  html, text\r
+ * \r
+ * outerHTML が欲しい場合は、xnode.attr('outerHTML') とできる。\r
  */\r
-\r
 function X_Node_html( html ){\r
        var _ = '', q = '"', xnodes, n, i, l;\r
        // setter\r
@@ -1114,20 +1120,6 @@ var X_Node__updateRawNode =
                                };\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 ) ) ){\r
-                                       X_UA.Opera78 || X_UA.NN6 ?\r
-                                               elm.setAttribute( 'style', that._cssText ) : // opera8用\r
-                                               ( elm.style.cssText = that._cssText );\r
-                               } else {\r
-                                       elm.style.cssText = ''; // IE5.5以下 Safari3.2 で必要\r
-                                       elm.removeAttribute( 'style' );\r
-                                       delete that._cssText;\r
-                               };\r
-                       };\r
-                       \r
                        if( that._dirty & X_Node_Dirty.IE_FILTER ){\r
                                elm.style.filter = X_Node_CSS_objToIEFilterText( that );;\r
                        };\r
@@ -1136,24 +1128,45 @@ var X_Node__updateRawNode =
                        // TODO display:none の場合、更新をスキップ\r
                        if( that._dirty & X_Node_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
-                                       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
-                                                               elm.appendChild( document.createTextNode( attrs[ k ] ) );\r
-                                                       continue;\r
-                                               };\r
-                                       };\r
-                                       // TODO IE では input, なぜか buttonも、type の変更が出来ない、object も 同値で置き換えようとしても不可\r
+                                       //if( X_EMPTY_OBJECT[ k ] ) continue;\r
+                                       // TODO IE では input, なぜか button, object も type の変更が出来ない、同値で置き換えようとしても不可\r
                                        ( v = attrs[ k ] ) === undefined ?\r
                                                elm.removeAttribute( rename[ k ] || k ) :\r
-                                               ( elm[ rename[ k ] || k ] = X_Node_Attr_noValue[ k ] ? k : v );                         \r
-\r
+                                               ( elm[ rename[ k ] || k ] = X_Node_Attr_noValue[ k ] ? k : v );\r
                                };\r
                                delete that._newAttrs;\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 ) ) ){\r
+                                       X_UA.Opera78 || X_UA.NN6 ?\r
+                                               elm.setAttribute( 'style', that._cssText ) : // opera8用\r
+                                               ( elm.style.cssText = that._cssText );\r
+                               } else {\r
+                                       elm.style.cssText = ''; // IE5.5以下 Safari3.2 で必要\r
+                                       elm.removeAttribute( 'style' );\r
+                                       delete that._cssText;\r
+                               };\r
+                       };\r
+                       \r
                        delete that._dirty;\r
                }) :\r
        X_UA_DOM.IE4 ? \r
@@ -1197,6 +1210,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_EMPTY_OBJECT[ k ] ) continue;\r
                                        ( v = attrs[ k ] ) === undefined ?\r
                                                elm.removeAttribute( rename[ k ] || k ) :\r
                                        //that._tag === 'TEXTAREA' && k === 'value' ?\r
@@ -1313,7 +1327,7 @@ var X_Node__actualCreate =
 \r
 var X_Node__afterActualCreate =\r
        X_UA_DOM.W3C ? (function( that ){\r
-               var elm = that._rawObject, xnodes, l, attrs, k, i;\r
+               var elm = that._rawObject, xnodes, l, i;\r
 \r
                that._root  = that.parent._root;\r
                \r
@@ -1326,11 +1340,17 @@ var X_Node__afterActualCreate =
                l      = xnodes && xnodes.length;\r
                \r
                if( that._isNew ){\r
-                       if( !X_Node_useDocumentFragment && l ){// docFrg が使えない場合、doc 追加後に子を追加\r
+                       if( !X_Node_useDocumentFragment /*&& l*/ ){// docFrg が使えない場合、doc 追加後に子を追加\r
                                for( i = 0; i < l; ++i ){\r
                                        elm.appendChild( X_Node__actualCreate( xnodes[ i ], true ) );\r
+                                       X_Node__afterActualCreate( xnodes[ i ] );\r
+                               };\r
+                       } else {\r
+                               for( i = 0; i < l; ++i ){\r
+                                       X_Node__afterActualCreate( xnodes[ i ] );\r
                                };\r
                        };\r
+                       \r
                        if( X_Node_strictElmCreation ){\r
                                if( that._dirty & X_Node_Dirty.IE_FILTER ){\r
                                        elm.style.filter = X_Node_CSS_objToIEFilterText( that );;\r
@@ -1341,16 +1361,27 @@ var X_Node__afterActualCreate =
                                that._newAttrs = that._attrs;\r
                                that._dirty = X_Node_Dirty.ID | X_Node_Dirty.CLASSNAME | X_Node_Dirty.CSS | X_Node_Dirty.ATTR | X_Node_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
                        delete that._isNew;\r
                } else {\r
+                       \r
+                       for( i = 0; i < l; ++i ){\r
+                               X_Node__afterActualCreate( xnodes[ i ] );\r
+                       };\r
+                       // 親要素の updateRawNode 前に子要素の updateRawNode を行う\r
+                       // 親要素が GPU レイヤーに転送されるケースがあるので、先に子要素の変更を済ませる\r
                        that._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
                // src の onload があるので先ではないか?\r
                // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
                X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r