OSDN Git Service

Version 0.6.145, fix X.Audio, fix VIEW_ACTIVATE Event @X.ViewPort.
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 02_XNode.js
index ab3d01c..d71a866 100644 (file)
@@ -68,7 +68,7 @@ var   X_Node_BITMASK_RESET_STYLE  = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ (
        \r
        X_Node_BitMask_IE4_IS_MIX   = X_Node_State.IE4_HAS_TEXTNODE | X_Node_State.IE4_HAS_ELEMENT,\r
        \r
-       /** @enum {number} */\r
+       /* @enum {number} */\r
        X_Node_TYPE = {\r
                XNODE       : 1,\r
                RAW_HTML    : 2,\r
@@ -142,7 +142,6 @@ var Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ](
                /**\r
                 * NodeList と動作を一致させるためのプロパティ。常に 1。\r
                 * @type {number}\r
-                * @private\r
                 * @alias Node.prototype.length\r
                 */\r
                length       : 1,\r
@@ -150,7 +149,6 @@ var Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ](
                /**\r
                 * 親 Node。\r
                 * @type {Node}\r
-                * @private\r
                 * @alias Node.prototype.parent\r
                 */\r
                parent       : null, // remove された枝も親子構造は維持している。\r
@@ -671,7 +669,14 @@ function X_Node_appendAt( start, v ){
                        return this;\r
                case X_Node_TYPE.XNODE :\r
                        // 親の xnodes から v を消す\r
-                       v.parent && v[ 'remove' ]();\r
+                       if( v.parent ){\r
+                               if( v.parent === this ){\r
+                                       i = v[ 'getOrder' ]();\r
+                                       if( i === start ) return this;\r
+                                       if( i < start ) --start;\r
+                               };\r
+                               v[ 'remove' ]();\r
+                       };\r
                        // IE4 でテキストノードの追加、FIXED 済でない場合、親に要素の追加を通知\r
                        if( X_UA[ 'IE4' ] && !v[ '_tag' ] && ( this[ '_flags' ] & X_Node_State.IE4_FIXED ) === 0 ) this[ '_flags' ] |= X_Node_State.IE4_DIRTY_CHILDREN;\r
                        break;\r
@@ -716,14 +721,14 @@ function X_Node_appendTo( parent, opt_index ){
 \r
 \r
 /**\r
- * ノードの直前の要素を取得。または直前に挿入。\r
+ * ノードの直前の要素を取得。または直前に挿入。挿入する要素が先にいる兄弟でも正しく動作する。\r
  * @alias Node.prototype.prev\r
- * @param {Node|string|HTMLElement|TextNode} [v] HTMLElement と TextNode は内部のみ。\r
+ * @param {Node|string|HTMLElement|TextNode} [...v] HTMLElement と TextNode は内部のみ。\r
  * @return {Node} 自身。チェインメソッド\r
  * @example childNode.prev( prevNode );\r
  */\r
 function X_Node_prev( v ){\r
-       var parent = this.parent, xnodes, i, l, start;\r
+       var parent = this.parent, xnodes, i, l;\r
        \r
        // getter\r
        if( v === undefined ){\r
@@ -736,19 +741,18 @@ function X_Node_prev( v ){
        if( !parent ) return this;\r
        \r
        l = arguments.length;\r
-       start = this[ 'getOrder' ]();\r
        if( 1 < l ){\r
-               for( ; l; ){\r
-                       parent[ 'appendAt' ]( start, arguments[ --l ] );\r
+               for( i = 0; l; ++i ){\r
+                       parent[ 'appendAt' ]( this[ 'getOrder' ]() - i, arguments[ --l ] );\r
                };\r
                return this;\r
        };\r
-       parent[ 'appendAt' ]( start, v );\r
+       parent[ 'appendAt' ]( this[ 'getOrder' ](), v );\r
        return this;\r
 };\r
 \r
 /**\r
- * ノードの直後の要素を取得。または直後に挿入。\r
+ * ノードの直後の要素を取得。または直後に挿入。挿入する要素が先にいる兄弟でも正しく動作する。\r
  * @alias Node.prototype.next\r
  * @param {Node|string|HTMLElement|TextNode} [v] HTMLElement と TextNode は内部のみ。\r
  * @return {Node} 自身。チェインメソッド\r
@@ -769,23 +773,19 @@ function X_Node_next( v ){
        \r
        l = arguments.length;\r
        start = this[ 'getOrder' ]() + 1;\r
+       \r
        if( parent[ '_xnodes' ].length <= start ){\r
-               if( 1 < l ){\r
-                       for( i = 0; i < l; ++i ){\r
-                               parent[ 'append' ]( arguments[ i ] );\r
-                       };\r
-                       return this;\r
+               for( i = 0; i < l; ++i ){\r
+                       parent[ 'append' ]( arguments[ i ] );\r
                };\r
-               parent[ 'append' ]( v );\r
-               return this;\r
-       };\r
+       } else\r
        if( 1 < l ){\r
                for( ; l; ){\r
-                       parent[ 'appendAt' ]( start, arguments[ --l ] );\r
+                       parent[ 'appendAt' ]( this[ 'getOrder' ]() + 1, arguments[ --l ] );\r
                };\r
-               return this;\r
+       } else {\r
+               parent[ 'appendAt' ]( start, v );\r
        };\r
-       parent[ 'appendAt' ]( start, v );\r
        return this;\r
 };\r
 \r
@@ -1195,28 +1195,25 @@ function X_Node_text( text ){
 function X_Node_call( name /*, opt_args... */ ){\r
        var l = arguments.length - 1,\r
                raw, func, args, params, i;\r
-               \r
-       X_Node_updateTimerID && X_Node_startUpdate();\r
-       \r
+\r
        switch( name ){\r
                case 'nodeType' :\r
                        return this[ '_tag' ] ? 1 : 3;\r
-               case 'text' :\r
-                       return this[ 'text' ]();\r
-               case 'html' :\r
-               case 'innerHTML' :\r
-                       return this[ 'html' ]();\r
                case 'outerHTML' :\r
                        X_Node_outerXNode = X_Node_body; // == true ならなんでもよい。型を合わすために xbody にしている\r
                        v = this[ 'html' ]();\r
                        X_Node_outerXNode = null;\r
                        return v;\r
+               case 'treeIsDirty' :\r
+                       return !!X_Node_updateTimerID;\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
+       X_Node_updateTimerID && X_Node_startUpdate();\r
+       \r
        raw  = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
        if( !raw ) return;\r
        \r
@@ -1327,6 +1324,8 @@ function X_Node_startUpdate( time ){
        if( time ){\r
                // X.Timer 経由でないと発火しない このイベントでサイズを取ると無限ループに\r
                X_System[ '_listeners' ] && X_System[ '_listeners' ][ X_EVENT_UPDATED ] && X_System[ 'dispatch' ]( X_EVENT_UPDATED );   \r
+       } else {\r
+               X_System[ '_listeners' ] && X_System[ '_listeners' ][ X_EVENT_UPDATED ] && X_System[ 'asyncDispatch' ]( X_EVENT_UPDATED );\r
        };\r
        \r
        X_ViewPort[ '_listeners' ] && X_ViewPort[ '_listeners' ][ X_EVENT_AFTER_UPDATE ] && X_ViewPort[ 'asyncDispatch' ]( X_EVENT_AFTER_UPDATE );\r
@@ -1359,13 +1358,12 @@ var X_Node__commitUpdate =
                        };\r
 \r
                        // 2. GPU解放予約\r
-                       // TODO もしかしたらこのタイミングで更新できるかも。\r
                        if( that[ '_flags' ] & X_Node_State.GPU_RELEASE_RESERVED ){\r
-                               console.log( 'GPU 解放 ' );\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
+                               //return elm;// TODO もしかしたらこのタイミングで更新できるかも。\r
                        };\r
 \r
                        // 3. GPU予約 -> GPU\r