OSDN Git Service

Fix the bug of X.NodeAnime.
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 22_XTreeBuilder.js
index 7daff08..5a205c7 100644 (file)
@@ -22,29 +22,31 @@ if( X_UA[ 'MacIE' ] ){
                        //node.data = '';\r
                        l = X_TEMP._removalTextNodes.length;\r
                        if( parent ){\r
-                               //!l && X_Timer_once( 0, X_TEMP._timerRemove );\r
-                               //X_TEMP._removalTextNodes[ l ] = node;\r
-                               //var str=[],p;\r
-                               //for( p in node ){\r
-                               //      str[str.length] = p;\r
-                               //};\r
-                               //alert( str.join( ',' ) + parent.innerHTML );\r
-                               //node.nodeValue = '';\r
-                               //parent.replaceChild( document.createElement( 'span' ), node );\r
-                               //var e;\r
-                               //var f = document.createDocumentFragment();\r
-                               //f.appendChild( e = document.createElement( 'span' ) );\r
-                               //f.replaceChild( node, e );\r
-                               //e.appendChild( f );\r
-                               //parent.appendChild( e = document.createElement( 'span' ) );\r
-                               //e.appendChild( node );\r
-                               //parent.removeChild( e );\r
-                               //node.parentNode = null;\r
-                               //document.body.appendChild( node );\r
-                               //parent.replaceChild( document.createComment( '' ), node );\r
-                               document.body.appendChild( node );\r
+                               /*\r
+                               !l && X_Timer_once( 0, X_TEMP._timerRemove );\r
+                               X_TEMP._removalTextNodes[ l ] = node;\r
+                               var str=[],p;\r
+                               for( p in node ){\r
+                                       str[str.length] = p;\r
+                               };\r
+                               alert( str.join( ',' ) + parent.innerHTML );\r
+                               node.nodeValue = '';\r
+                               parent.replaceChild( document.createElement( 'span' ), node );\r
+                               var e;\r
+                               var f = document.createDocumentFragment();\r
+                               f.appendChild( e = document.createElement( 'span' ) );\r
+                               f.replaceChild( node, e );\r
+                               e.appendChild( f );\r
+                               parent.appendChild( e = document.createElement( 'span' ) );\r
+                               e.appendChild( node );\r
+                               parent.removeChild( e );\r
+                               node.parentNode = null;\r
+                               X_elmBody.appendChild( node );\r
+                               parent.replaceChild( document.createComment( '' ), node ); */\r
+                               X_elmBody.appendChild( node );\r
                                return;\r
-                               if( parent.parentNode !== document.body ){\r
+                               /*\r
+                               if( parent.parentNode !== X_elmBody ){\r
                                        var clone = parent.cloneNode( true );\r
                                        for( var i = 0, l = parent.childNodes.length; i < l; ++i ){\r
                                                if( parent.childNodes[ i ] !== node ){\r
@@ -60,7 +62,7 @@ if( X_UA[ 'MacIE' ] ){
                                        };\r
                                } else {\r
                                        // ignore\r
-                               };\r
+                               }; */\r
 \r
                        };\r
                        //if( !node.ownerDocument ) alert( 'no owner' );\r
@@ -105,11 +107,12 @@ if( X_UA[ 'Opera7' ] ){
  * http://kojs.sukobuto.com/docs/visible-binding\r
  * IE6 には、「空の span エレメントに続く空白は無視される」という謎な癖があります。 \r
  */\r
-X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT,\r
+\r
+X_TEMP._onPreInit =\r
        X_UA_DOM.W3C ?\r
 (function(){\r
        var r    = X_Node_body,\r
-               body = r[ '_rawObject' ],\r
+               body = X_elmBody,\r
                copy, i, l, node, html,\r
                elmProgress;\r
        \r
@@ -121,8 +124,8 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT,
        // textarea の内容を控えて、消す。xnode tree 構築後に復帰。でないと、html パースでこける\r
        //X_UA[ 'MacIE' ] && alert( body.innerHTML );\r
        // cleanup tree \r
-       (function/*cleanUpTree*/( elm, skip, head ){\r
-               var nodes      = X_Object_cloneArray( elm.childNodes ),\r
+       function cleanUpTree( elm, skip ){\r
+               var nodes      = X_Array_copy( elm.childNodes ),\r
                        i          = 0,\r
                        l          = nodes.length,\r
                        node, tag, textNode, content;\r
@@ -132,8 +135,7 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT,
                                case 1 :\r
                                        tag = node.tagName.toUpperCase();\r
                                        if( X_Dom_DTD_MOVE_TO_HEAD[ tag ] ){\r
-                                               head = head || document.getElementsByTagName( 'head' )[ 0 ];\r
-                                               head.appendChild( node );\r
+                                               X_elmHead.appendChild( node );\r
                                                continue;\r
                                        } else\r
                                        if( X_TEMP._isCleanupTarget( node ) ){\r
@@ -141,7 +143,7 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT,
                                                continue;\r
                                        } else {\r
                                                // pre タグ以下はスペースの置換は行わない\r
-                                               node.childNodes && node.childNodes.length && /*cleanUpTree*/arguments.callee( node, skip || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ], head );\r
+                                               node.childNodes && node.childNodes.length && cleanUpTree( node, skip || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ] );\r
                                        };\r
                                        textNode = null;\r
                                        break;\r
@@ -167,7 +169,9 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT,
                                        //++count;\r
                        };\r
                };\r
-       })( X_UA[ 'MacIE' ] ? ( copy = body.cloneNode( true ) ) : body );\r
+       };\r
+\r
+       cleanUpTree( X_UA[ 'MacIE' ] ? ( copy = body.cloneNode( true ) ) : body );\r
 \r
        if( X_UA[ 'MacIE' ] ){\r
                document.write( html = copy.innerHTML );\r
@@ -189,28 +193,16 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT,
                };              \r
        };\r
        \r
-       body.appendChild( elmProgress = document.createElement( 'div' ) );\r
+       body.appendChild( X_TEMP.elmProgress = elmProgress = document.createElement( 'div' ) );\r
        elmProgress.style.cssText = 'position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;';\r
        elmProgress.setAttribute( 'style', 'position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;' );\r
        \r
        X_HTMLParser_asyncParse( html, true )\r
-               [ 'listen' ]( X_EVENT_PROGRESS,\r
-                       function( e ){\r
-                               elmProgress.style.width = ( e[ 'percent' ] * 100 | 0 ) + '%';\r
-                       }\r
-               )\r
-               [ 'listenOnce' ]( X_EVENT_SUCCESS,\r
-                       function( e ){\r
-                               var xnodes = X_Node_body[ '_xnodes' ] = [], t;\r
-                               xnodes.push.apply( xnodes, e.xnodes );\r
-                               elmProgress.style.width = '100%';\r
-       \r
-                               X_TEMP.asyncCreateTree( X_Node_body, body.childNodes, elmProgress );\r
-                       }\r
-               );\r
+               [ 'listen' ]( X_EVENT_PROGRESS, X_TEMP._handleEvent )\r
+               [ 'listenOnce' ]( X_EVENT_SUCCESS, X_TEMP._handleEvent );\r
 \r
 }) :\r
-X_UA_DOM.IE4 ?\r
+// X_UA_DOM.IE4 ?\r
 (function(){\r
        var r    = X_Node_body,\r
                body = r[ '_rawObject' ],\r
@@ -218,7 +210,7 @@ X_UA_DOM.IE4 ?
                html;\r
 \r
        if( !X_TEMP.X_Dom_useBuilder ) return;\r
-\r
+       \r
        /*\r
         * http://support.microsoft.com/kb/812417/ja\r
         * PRB: outerHTML の HTML 要素のプロパティは、既定の属性は表示されません。\r
@@ -227,30 +219,39 @@ X_UA_DOM.IE4 ?
         */\r
        html = body.innerHTML;\r
        body.insertAdjacentHTML( 'BeforeEnd', '<div id="' + elmProgress + '" style="position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;"></div>' );\r
-       elmProgress = document.all[ elmProgress ];\r
+       X_TEMP.elmProgress = document.all[ elmProgress ];\r
        \r
        X_HTMLParser_asyncParse( html, true )\r
-               [ 'listen' ]( X_EVENT_PROGRESS,\r
-                       function( e ){\r
-                               elmProgress.style.width = ( e.percent * 100 | 0 ) + '%';\r
-                       }\r
-               )\r
-               [ 'listenOnce' ]( X_EVENT_SUCCESS,\r
-                       function( e ){\r
-                               var xnodes = X_Node_body[ '_xnodes' ] = [], t;\r
-                               xnodes.push.apply( xnodes, e.xnodes );\r
-                               elmProgress.style.width = '100%';\r
-                               \r
-                               X_TEMP.asyncCreateTree( X_Node_body, body.childNodes || body.children, elmProgress );\r
-                       }\r
-               );\r
-}) :\r
-(function(){\r
+               [ 'listen' ]( X_EVENT_PROGRESS, X_TEMP._handleEvent )\r
+               [ 'listenOnce' ]( X_EVENT_SUCCESS, X_TEMP._handleEvent );\r
+});\r
+\r
+X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, X_TEMP._onPreInit );\r
+\r
+X_TEMP._handleEvent = function( e ){\r
+       var elmProgress = X_TEMP.elmProgress, xnodes;\r
        \r
-}) );\r
+       switch( e.type ){\r
+               case X_EVENT_PROGRESS :\r
+                       elmProgress.style.width = ( e.percent * 100 | 0 ) + '%';\r
+                       break;\r
+                       \r
+               case X_EVENT_SUCCESS :\r
+                       xnodes = X_Node_body[ '_xnodes' ] = [];\r
+                       \r
+                       xnodes.push.apply( xnodes, e.xnodes );\r
+                       elmProgress.style.width = '100%';\r
+                       \r
+                       X_TEMP.asyncCreateTree( X_Node_body, X_elmBody.childNodes || X_elmBody.children, elmProgress );\r
+                       \r
+                       delete X_TEMP._onPreInit;\r
+                       delete X_TEMP.elmProgress;\r
+                       break;\r
+       };\r
+};\r
 \r
 X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){\r
-       var xnodes      = async ? 0           : X_Object_cloneArray( parent[ '_xnodes' ] ),\r
+       var xnodes      = async ? 0           : X_Array_copy( parent[ '_xnodes' ] ),\r
                l           = async ? 0           : xnodes.length,\r
                stack       = async ? async.stack : [],\r
                done        = async ? async.done  : 0,\r
@@ -260,7 +261,7 @@ X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){
                        xnodes : xnodes,\r
                        l      : l,\r
                        i      : 0,\r
-                       elems  : X_Object_cloneArray( elems ),\r
+                       elems  : X_Array_copy( elems ),\r
                        j      : 0,\r
                        xtext  : null,\r
                        flag   : 0\r
@@ -291,7 +292,7 @@ X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){
                                        continue;\r
                                };\r
                                \r
-                               if( startTime + 16 <= X_Timer_now() ){\r
+                               if( startTime + X_Timer_INTERVAL_TIME <= X_Timer_now() ){\r
                                        current.i = i;\r
                                        if( async ){\r
                                                async.current = i < l && current;\r
@@ -310,7 +311,14 @@ X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){
        // complete\r
        console.log( 'xtree 作成完了' );\r
        X_ViewPort[ 'asyncDispatch' ]( X_EVENT_XTREE_READY );\r
-       elmProgress.parentNode ? elmProgress.parentNode.removeChild( elmProgress ) : ( elmProgress.outerHTML = '' );\r
+       \r
+       if( X_UA[ 'IE' ] < 6 ){\r
+               // IE5.01 でビルド時間が短い時に removeChild を通るとエラー!\r
+               elmProgress.outerHTML = '';\r
+       } else {\r
+               elmProgress.parentNode.removeChild( elmProgress );\r
+       };\r
+       \r
        delete X_TEMP.asyncCreateTree;\r
        delete X_TEMP.bindElementToXnode;\r
        delete X_TEMP.X_Dom_useBuilder;\r
@@ -385,12 +393,12 @@ X_TEMP.bindElementToXnode =
                                                        \r
                                                        return {\r
                                                                me     : xnode,\r
-                                                               xnodes : X_Object_cloneArray( xnode[ '_xnodes' ] ),\r
+                                                               xnodes : X_Array_copy( xnode[ '_xnodes' ] ),\r
                                                                xtext  : null,\r
                                                                flag   : 0,\r
                                                                i      : 0,\r
                                                                l      : xnode[ '_xnodes' ].length,\r
-                                                               elems  : X_Object_cloneArray( elm.childNodes ),\r
+                                                               elems  : X_Array_copy( elm.childNodes ),\r
                                                                j      : 0,\r
                                                                skipCleanup : skipCleanup || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ]\r
                                                        };\r
@@ -524,12 +532,12 @@ X_TEMP.bindElementToXnode =
                                        if( xnode[ '_xnodes' ] && xnode[ '_xnodes' ].length ){\r
                                                return {\r
                                                        me     : xnode,\r
-                                                       xnodes : X_Object_cloneArray( xnode[ '_xnodes' ] ),\r
+                                                       xnodes : X_Array_copy( xnode[ '_xnodes' ] ),\r
                                                        xtext  : null,\r
                                                        flag   : 0,\r
                                                        i      : 0,\r
                                                        l      : xnode[ '_xnodes' ].length,\r
-                                                       elems  : X_Object_cloneArray( elm.children ),\r
+                                                       elems  : X_Array_copy( elm.children ),\r
                                                        j      : 0,\r
                                                        skipCleanup : skipCleanup || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ]\r
                                                };\r