OSDN Git Service

Version 0.6.138, working X.UI.ScrollBox!, fix Node.prev & Node.next.
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 02_XNode.js
index ab3d01c..c0bb170 100644 (file)
@@ -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
@@ -1213,6 +1213,9 @@ function X_Node_call( name /*, opt_args... */ ){
                        return v;\r
                case 'fontSize' :\r
                        return X_Node_CSS_getCharSize( this );\r
+               case 'GPU' :\r
+                       return this[ '_flags' ] & X_Node_State.GPU_NOW ? 'NOW' :\r
+                               this[ '_flags' ] & X_Node_State.GPU_RELEASE_RESERVED ? '解除予約' : '';\r
                case 'inGPU' :\r
                        return !!( this[ '_flags' ] & ( X_Node_State.GPU_NOW | X_Node_State.GPU_RELEASE_RESERVED ) );\r
        };\r
@@ -1359,13 +1362,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