OSDN Git Service

Version 0.6.42, bugfix for tree update event.
authoritozyun <itozyun@user.sourceforge.jp>
Thu, 22 May 2014 13:03:54 +0000 (22:03 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Thu, 22 May 2014 13:03:54 +0000 (22:03 +0900)
0.6.x/js/core/01_XUa.js
0.6.x/js/core/03_XCallback.js
0.6.x/js/core/05_XTimer.js
0.6.x/js/dom/11_XDomNode.js
0.6.x/js/dom/12_XDomEvent.js
0.6.x/js/dom/22_XDomBuilder.js

index 48ecc23..60eea65 100644 (file)
@@ -15,6 +15,7 @@ X.UA = (function( n, undefined ){
                        i !== -1 ? parseFloat( dua.substr( i + 6 ) ) : 0,\r
                        j !== -1 ? parseFloat( dua.substr( j + 8 ) ) : 0,\r
                        tv );\r
+               acme.OperaMini   = 0 < dua.indexOf("Opera Mini");\r
                acme.OperaMobile = 0 < dua.indexOf("Opera Mobi");\r
                acme.OperaTablet = 0 < dua.indexOf("Opera Tablet");\r
                return acme;\r
@@ -24,11 +25,28 @@ X.UA = (function( n, undefined ){
        if( document.all ){\r
                acme.ActiveX = !!window[ 'ActiveXObject' ];\r
                acme.IE = parseFloat(dav.split("MSIE ")[1]) || parseFloat(dua.split("rv:")[1]) || 0;\r
+               acme.IEMobile = dua.toLowerCase().indexOf( 'iemobile' ) !== -1 ||\r
+                                               dua.toLowerCase().indexOf( 'windows phone' ) !== -1;            \r
                return acme;\r
        };\r
        \r
+       if( i = dua.indexOf( 'NetFront\/' ) ){\r
+               acme.NetFront = parseFloat( dua.substr( i + 9 ) ) || 0;\r
+               return acme;\r
+       };\r
+       \r
+       if( 0 < dua.indexOf( 'Gecko\/' ) && ( i = dua.indexOf( 'rv:' ) ) ){\r
+               v = dua.substr( i + 3 ).split( '.' );\r
+               acme.Gecko = parseFloat( v[ 0 ] ) || 0 +\r
+                       ( parseFloat( v[ 1 ] ) || 0 ) / 10 +\r
+                       ( parseFloat( v[ 2 ] ) || 0 ) / 100;\r
+               \r
+               //Fennec\r
+               //Firefox\r
+               //Netscape\r
+       };\r
+       \r
        // Blink\r
-       // Netfront\r
        // iCab\r
        acme.Khtml  = ( dav.indexOf("Konqueror") >= 0 ) ? tv : undefined;\r
        acme.WebKit = parseFloat(dua.split("WebKit\/")[1]) || undefined;\r
@@ -55,28 +73,29 @@ X.UA = (function( n, undefined ){
                        acme.Safari = 2;\r
                };\r
        };\r
+       \r
+       acme.Android  = dua.toLowerCase().indexOf( 'android' ) !== -1;  \r
+       \r
+       acme.iOS      = dua.toLowerCase().indexOf( 'iphone' ) !== -1 ||\r
+                                       dua.toLowerCase().indexOf( 'ipad' ) !== -1 ||\r
+                                       dua.toLowerCase().indexOf( 'ipod' ) !== -1;\r
+       \r
+       acme.TouchPad = dua.toLowerCase().indexOf( 'hp-tablet' ) !== -1; // webOS\r
+       \r
+       //http://www.useragentstring.com/pages/Iris/\r
+       acme.Iris     = dua.toLowerCase().indexOf( 'iris' ) !== -1;\r
+       \r
+       acme.EInk =\r
+               // Kobo Mozilla/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit/533.1 (KHTML, like Gecko) Verson/4.0 Mobile Safari/533.1 (Kobo Touch)\r
+               dua.indexOf( 'Kobo' ) !== -1 ||\r
+               // Kindle paperwhite Mozilla/5.0 (X11; U; Linux armv7l like Android; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/533.2+ Kindle/3.0+\r
+               dua.indexOf( 'Kindle' ) !== -1 ||\r
+               // Sony Reader Mozilla/5.0 (Linux; U; ja-jp; EBRD1101; EXT) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1\r
+               dua.indexOf( 'EBRD' ) !== -1;   \r
+       \r
        return acme;\r
 })( navigator );\r
 \r
-X.UA.Android  = navigator.userAgent.toLowerCase().indexOf( 'android' ) !== -1;\r
-X.UA.iOS      = navigator.userAgent.toLowerCase().indexOf( 'iphone' ) !== -1 ||\r
-                               navigator.userAgent.toLowerCase().indexOf( 'ipad' ) !== -1 ||\r
-                               navigator.userAgent.toLowerCase().indexOf( 'ipod' ) !== -1;\r
-X.UA.IEMobile = navigator.userAgent.toLowerCase().indexOf( 'iemobile' ) !== -1 ||\r
-                               ( X.UA.IE && navigator.userAgent.toLowerCase().indexOf( 'windows phone' ) !== -1 );\r
-X.UA.TouchPad = navigator.userAgent.toLowerCase().indexOf( 'hp-tablet' ) !== -1;\r
-\r
-//http://www.useragentstring.com/pages/Iris/\r
-X.UA.Iris     = navigator.userAgent.toLowerCase().indexOf( 'iris' ) !== -1;\r
-\r
-X.UA.EInk =\r
-       // Kobo Mozilla/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit/533.1 (KHTML, like Gecko) Verson/4.0 Mobile Safari/533.1 (Kobo Touch)\r
-       navigator.userAgent.indexOf( 'Kobo' ) !== -1 ||\r
-       // Kindle paperwhite Mozilla/5.0 (X11; U; Linux armv7l like Android; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/533.2+ Kindle/3.0+\r
-       navigator.userAgent.indexOf( 'Kindle' ) !== -1 ||\r
-       // Sony Reader Mozilla/5.0 (Linux; U; ja-jp; EBRD1101; EXT) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1\r
-       navigator.userAgent.indexOf( 'EBRD' ) !== -1;\r
-\r
 X.inObject = X.UA.IE && X.UA.IE < 5 ?\r
        (function( name, obj ){\r
                var p;\r
index 0cc02ea..484a263 100644 (file)
@@ -64,6 +64,7 @@ X.Callback = {
                };\r
                return f;\r
        },\r
+       \r
        _contextCallback : function(){\r
                var f = this,\r
                        a = f.a,\r
index 6df8821..058b8c4 100644 (file)
@@ -2,96 +2,78 @@
  * use X.Callback\r
  */\r
 \r
-X.Timer = ( function(){\r
-       var setTimeout     = window.setTimeout,\r
-               clearTimeout   = window.clearTimeout,\r
-               INTERVAL_TIME  = 16,\r
-               TICKET_LIST    = [],\r
-               uid            = 0,\r
-               timerId        = 0,\r
-               endTime        = 0,\r
-               next           = 0,\r
-               INDEX_TIME     = 0,\r
-               INDEX_LAST     = 1,\r
-               INDEX_COUNT    = 2,\r
-               INDEX_CALLBACK = 3,\r
-               INDEX_UID      = 4;\r
+var _enterFrame =\r
+               window.requestAnimationFrame ||\r
+               window.webkitRequestAnimationFrame ||\r
+               window.mozRequestAnimationFrame ||\r
+               window.oRequestAnimationFrame ||\r
+               window.msRequestAnimationFrame ||\r
+               false,\r
+       _cancelFrame =\r
+               window.cancelRequestAnimationFrame ||\r
+               window.webkitCancelAnimationFrame ||\r
+               window.webkitCancelRequestAnimationFrame ||\r
+               window.mozCancelRequestAnimationFrame ||\r
+               window.oCancelRequestAnimationFrame ||\r
+               window.msCancelRequestAnimationFrame ||\r
+               false;\r
+\r
+X.Timer = {\r
+       INTERVAL_TIME  : 16,\r
+       TICKET_LIST    : [],\r
+       uid            : 0,\r
+       timerId        : 0,\r
+       endTime        : 0, // iOS\r
+       next           : 0,\r
+\r
+       REQUEST_FRAME_LIST : [],\r
+       requestID : 0,\r
        \r
-       function loop(){\r
-               var c    = next,\r
-                       list = TICKET_LIST,\r
+       _loop : function(){\r
+               var next = X.Timer.next,\r
+                       list = X.Timer.TICKET_LIST,\r
                        i    = list.length,\r
-                       queue, f, ret;\r
+                       q, f, c;\r
            for( ; i; ){\r
-               queue = list[ --i ];\r
-                       if( 0 < ( queue[ INDEX_LAST ] -= c ) ) continue;\r
-                       f   = queue[ INDEX_CALLBACK ];\r
-                       c   = queue[ INDEX_COUNT ];\r
-                       ret = f();\r
-                       if( ret & X.Callback.UN_LISTEN || c === 1 ){\r
+               q = list[ --i ];\r
+                       if( 0 < ( q.l -= next ) ) continue;\r
+                       f = q.f;\r
+                       c = q.c;\r
+                       if( f() & X.Callback.UN_LISTEN || c === 1 ){\r
                                list.splice( i, 1 );\r
                                f.kill && f.kill();\r
-                               queue.length = 0;\r
+                               //queue.length = 0;\r
                                continue;\r
                        } else\r
-                       if( 1 < c ) --queue[ INDEX_COUNT ];\r
-                       queue[ INDEX_LAST ] = queue[ INDEX_TIME ];\r
+                       if( 1 < c ) --q.c;\r
+                       q.l = q.t;\r
            };\r
-           timerId = 0;\r
-           update();\r
-       };\r
-       function update(){\r
-               var list = TICKET_LIST,\r
-                       l    = list.length,\r
-                       n    = 99999999,\r
-                       last;\r
-               if( l === 0 ){\r
-                       timerId !== -1 && clearTimeout( timerId );\r
-                       timerId = 0;\r
+           X.Timer.timerId = 0;\r
+           X.Timer._update();\r
+       },\r
+       _update : function(){\r
+               var list = X.Timer.TICKET_LIST,\r
+                       i    = list.length,\r
+                       n    = Infinity,\r
+                       l;\r
+               if( i === 0 ){\r
+                       X.Timer.timerId && window.clearTimeout( X.Timer.timerId );\r
+                       X.Timer.timerId = 0;\r
                        return;\r
                };\r
-           for( ; l; ){\r
-               ( last = list[ --l ][ INDEX_LAST ] ) < n && ( n = last );\r
+           for( ; i; ){\r
+               ( l = list[ --i ].l ) < n && ( n = l );\r
            };\r
-           if( n < next || timerId === 0 ){\r
-               timerId !== 0 && clearTimeout( timerId );\r
-               timerId   = setTimeout( loop, INTERVAL_TIME * n );\r
-               endTime   = X.getTime() + INTERVAL_TIME * n;\r
-               next = n;\r
+           if( n < X.Timer.next || X.Timer.timerId === 0 ){\r
+               X.Timer.timerId && window.clearTimeout( X.Timer.timerId );\r
+               X.Timer.timerId = window.setTimeout( X.Timer._loop, X.Timer.INTERVAL_TIME * n );\r
+               X.Timer.endTime = X.getTime() + X.Timer.INTERVAL_TIME * n; // iOS\r
+               X.Timer.next = n;\r
            };\r
-       };\r
+       },\r
        \r
-       // http://havelog.ayumusato.com/develop/javascript/e528-ios6_scrolling_timer_notcall.html\r
-       // iOS6 スクロール中のタイマー発火絡みのバグ備忘\r
-       if( X.UA.iOS ){\r
-                window.addEventListener( 'scroll', function(){\r
-                       if( timerId ){\r
-                               clearTimeout( timerId );\r
-                               timerId = setTimeout( loop, Math.max( 0, endTime - X.getTime() ) );\r
-                       };\r
-                } );\r
-       };\r
-       \r
-       var enterFrame =\r
-                       window.requestAnimationFrame ||\r
-                       window.webkitRequestAnimationFrame ||\r
-                       window.mozRequestAnimationFrame ||\r
-                       window.oRequestAnimationFrame ||\r
-                       window.msRequestAnimationFrame ||\r
-                       0,\r
-               cancelFrame =\r
-                       window.cancelRequestAnimationFrame ||\r
-                       window.webkitCancelAnimationFrame ||\r
-                       window.webkitCancelRequestAnimationFrame ||\r
-                       window.mozCancelRequestAnimationFrame ||\r
-                       window.oCancelRequestAnimationFrame ||\r
-                       window.msCancelRequestAnimationFrame ||\r
-                       0,\r
-               REQUEST_FRAME_LIST = [],\r
-               requestID;\r
-       \r
-       function onEnterFrame( time ){\r
-               var list = REQUEST_FRAME_LIST,\r
+       _onEnterFrame : function ( time ){\r
+               var list = X.Timer.REQUEST_FRAME_LIST,\r
                        i    = list.length,\r
                        f;\r
                time = time || ( Date.now ? Date.now() : +new Date );\r
@@ -101,58 +83,88 @@ X.Timer = ( function(){
                f.kill && f.kill();\r
            };\r
            list.length = 0;\r
-       };\r
+       },\r
        \r
-       return {\r
-               add : function( time, opt_count, args1, args2, args3 ){\r
-                       time = time < INTERVAL_TIME ? 1 : ( time / INTERVAL_TIME ) | 0; // 正の数で使える「Math.floor(x)」を「(x | 0)」に;\r
+       add : function( time, opt_count, args1, args2, args3 ){\r
+               var list = X.Timer.TICKET_LIST;\r
+               time = time < X.Timer.INTERVAL_TIME ? 1 : ( time / X.Timer.INTERVAL_TIME ) | 0; // 正の数で使える「Math.floor(x)」を「(x | 0)」に;\r
 \r
-                       if( typeof opt_count !== 'number' ){\r
-                               args3 = args2;\r
-                               args2 = args1;\r
-                               args1 = opt_count;\r
-                               opt_count = 0;\r
-                       };\r
+               if( typeof opt_count !== 'number' ){\r
+                       args3 = args2;\r
+                       args2 = args1;\r
+                       args1 = opt_count;\r
+                       opt_count = 0;\r
+               };\r
 \r
-                       TICKET_LIST[ TICKET_LIST.length ] = [ time, time, opt_count, X.Callback.create( args1, args2, args3 ), ++uid ];\r
-                   update();\r
-                   return uid;\r
-               },\r
-               once : function( time, args1, args2, args3 ){\r
-                       return X.Timer.add( time, 1, args1, args2, args3 );\r
-               },\r
-               remove : function( uid ){\r
-                       var list = TICKET_LIST,\r
-                               i    = list.length,\r
-                               l    = i,\r
-                               f, q;\r
+               list[ list.length ] = {\r
+                       t : time,\r
+                       l : time,\r
+                       c : opt_count,\r
+                       f : X.Callback.create( args1, args2, args3 ),\r
+                       u : ++X.Timer.uid\r
+               };\r
+           X.Timer._update();\r
+           return X.Timer.uid;\r
+       },\r
+       once : function( time, args1, args2, args3 ){\r
+               return X.Timer.add( time, 1, args1, args2, args3 );\r
+       },\r
+       remove : function( uid ){\r
+               var list = X.Timer.TICKET_LIST,\r
+                       i    = list.length,\r
+                       l    = i,\r
+                       f, q;\r
+               for( ; i; ){\r
+                       // TODO\r
+                       // fire 中の cancel\r
+                       if( ( q = list[ --i ] ).u === uid ){\r
+                               list.splice( i, 1 );\r
+                               f = q.f;\r
+                               f.kill && f.kill();\r
+                               ( /* q[ INDEX_COUNT ] <= next  || */ l === 1 ) && X.Timer._update();\r
+                               //q.length = 0;\r
+                               break;\r
+                       };\r
+               };\r
+       },\r
+       \r
+       requestFrame : _enterFrame ?\r
+               (function( args1, args2, args3 ){\r
+                       var i = X.Timer.REQUEST_FRAME_LIST.length,\r
+                               f;\r
+                       i === 0 && ( X.Timer.requestID = _enterFrame( X.Timer._onEnterFrame ) );\r
+                       f = X.Timer.REQUEST_FRAME_LIST[ i ] = X.Callback.create( args1, args2, args3 );\r
+                       return f.uid = ++X.Timer.uid;\r
+               }) :\r
+               (function( args1, args2, args3 ){\r
+                       var i = X.Timer.REQUEST_FRAME_LIST.length,\r
+                               f;\r
+                       i === 0 && ( X.Timer.requestID = X.Timer.add( 0, 1, X.Timer._onEnterFrame ) );\r
+                       f = X.Timer.REQUEST_FRAME_LIST[ i ] = X.Callback.create( args1, args2, args3 );\r
+                       return f.uid = ++X.Timer.uid;\r
+               }),\r
+       \r
+       cancelFrame : _cancelFrame ?\r
+               (function( uid ){\r
+                       var list = X.Timer.REQUEST_FRAME_LIST,\r
+                               l    = list.length,\r
+                               i    = l,\r
+                               f;\r
                        for( ; i; ){\r
-                               if( ( q = list[ --i ] )[ INDEX_UID ] === uid ){\r
+                               if( ( f = list[ --i ] ).uid < uid ) break;\r
+                               if( f.uid === uid ){\r
+                                       // TODO\r
+                                       // fire 中の cancel\r
                                        list.splice( i, 1 );\r
-                                       f = q[ INDEX_CALLBACK ];\r
+                                       delete f.uid;\r
                                        f.kill && f.kill();\r
-                                       ( /* q[ INDEX_COUNT ] <= next  || */ l === 1 ) && update();\r
-                                       q.length = 0;\r
+                                       l === 1 && _cancelFrame( X.Timer.requestID );\r
                                        break;\r
                                };\r
                        };\r
-               },\r
-               \r
-               // string only ie4-\r
-               _loop : X.UA.IE && X.UA.IE < 5 && (function( r ){\r
-                       loop = 'X.Timer._loop()';\r
-                       return r;\r
-               })( loop ),\r
-               \r
-               requestFrame : function( args1, args2, args3 ){\r
-                       var i = REQUEST_FRAME_LIST.length,\r
-                               f;\r
-                       i === 0 && ( requestID = ( enterFrame ? enterFrame( onEnterFrame ) : X.Timer.add( 0, 1, onEnterFrame ) ) );\r
-                       f = REQUEST_FRAME_LIST[ i ] = X.Callback.create( args1, args2, args3 );\r
-                       return f.uid = ++uid;\r
-               },\r
-               cancelFrame : function( uid ){\r
-                       var list = REQUEST_FRAME_LIST,\r
+               }) :\r
+               (function( uid ){\r
+                       var list = X.Timer.REQUEST_FRAME_LIST,\r
                                l    = list.length,\r
                                i    = l,\r
                                f;\r
@@ -162,10 +174,26 @@ X.Timer = ( function(){
                                        list.splice( i, 1 );\r
                                        delete f.uid;\r
                                        f.kill && f.kill();\r
-                                       l === 1 && ( cancelFrame ? cancelFrame( requestID ) : X.Timer.remove( requestID ) );\r
+                                       l === 1 && X.Timer.remove( X.Timer.requestID );\r
                                        break;\r
                                };\r
                        };\r
-               }\r
-       };\r
-})();
\ No newline at end of file
+               })\r
+       \r
+};\r
+\r
+// http://havelog.ayumusato.com/develop/javascript/e528-ios6_scrolling_timer_notcall.html\r
+// iOS6 スクロール中のタイマー発火絡みのバグ備忘\r
+if( X.UA.iOS ){\r
+        window.addEventListener( 'scroll', function(){\r
+               if( X.Timer.timerId ){\r
+                       X.Timer.clearTimeout( X.Timer.timerId );\r
+                       X.Timer.timerId = window.setTimeout( X.Timer._loop, Math.max( 0, X.Timer.endTime - X.getTime() ) );\r
+               };\r
+        } );\r
+};\r
+\r
+if( X.UA.IE && X.UA.IE < 5 ){\r
+       X.Timer[ '_ie4_loop' ] = X.Timer._loop;\r
+       X.Timer._loop = 'X.Timer._ie4_loop()';\r
+};\r
index 1763121..cbc5bf4 100644 (file)
@@ -837,8 +837,8 @@ Node.prototype._startUpdate = function(){
        } else {\r
                return;\r
        };\r
-\r
-       X.Dom._listeners && X.Dom._listeners[ X.Dom.Event.BEFORE_UPDATE ] && X.Dom.dispatch( { type : X.Dom.Event.BEFORE_UPDATE } );\r
+       // このイベントでサイズを取ると無限ループに\r
+       // X.Dom._listeners && X.Dom._listeners[ X.Dom.Event.BEFORE_UPDATE ] && X.Dom.dispatch( { type : X.Dom.Event.BEFORE_UPDATE } );\r
 \r
        removal = Node._reserveRemoval;\r
        \r
@@ -851,12 +851,13 @@ Node.prototype._startUpdate = function(){
                        xnode._actualRemove();\r
                        !this._state && xnode.kill();\r
                };\r
-               removal.length = 0;             \r
+               removal.length = 0;\r
        };\r
        \r
        Node._html._dirty ? Node._html._commitUpdate() : this._commitUpdate();\r
        \r
-       X.Dom._listeners && X.Dom._listeners[ X.Dom.Event.AFTER_UPDATE ] && X.Dom.dispatch( { type : X.Dom.Event.AFTER_UPDATE } );\r
+       //X.Dom._listeners && X.Dom._listeners[ X.Dom.Event.AFTER_UPDATE ] && X.Dom.dispatch( { type : X.Dom.Event.AFTER_UPDATE } );\r
+       X.Dom._listeners && X.Dom._listeners[ X.Dom.Event.AFTER_UPDATE ] && X.Dom.asyncDispatch( 0, { type : X.Dom.Event.AFTER_UPDATE } );\r
        //this._rawNode.style.visibility = tmp;\r
 };\r
 \r
index b08ade8..20f1385 100644 (file)
@@ -154,7 +154,7 @@ X.Dom.Event.BASE_FONT_RESIZED   = ++X.Event._LAST_EVENT;
 // same_page_jump\r
 // on_screen_keyboard_show\r
 // on_screen_keyboard_hide\r
-X.Dom.Event.BEFORE_UPDATE       = ++X.Event._LAST_EVENT;\r
+// X.Dom.Event.BEFORE_UPDATE       = ++X.Event._LAST_EVENT; // このイベントで要素のサイズを取得すると無限ループに!\r
 X.Dom.Event.AFTER_UPDATE        = ++X.Event._LAST_EVENT;\r
 // hash_change\r
 X.Dom.Event.BEFORE_UNLOAD       = ++X.Event._LAST_EVENT;\r
index bad1a9f..5525535 100644 (file)
@@ -15,6 +15,7 @@ X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT,
        var r    = Node.root,\r
                body = r._rawNode,\r
                i, n = 0,\r
+               html,\r
                elmProgress;\r
        // TODO\r
        // textarea の内容を控えて、消す。xnode tree 構築後に復帰。でないと、html パースでこける\r
@@ -65,11 +66,13 @@ X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT,
        })( body );\r
        \r
        // body の属性値の取得\r
-\r
+       html = body.innerHTML;\r
+       \r
        body.appendChild( 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.Dom.asyncParse( body.innerHTML, true )\r
+       X.Dom.asyncParse( html, true )\r
                .listen( X.Event.PROGRESS,\r
                        function(e){\r
                                elmProgress.style.width = ( e.progress * 100 | 0 ) + '%';\r
@@ -87,7 +90,8 @@ X.Dom.DOM_IE4 ?
 (function(){\r
        var r    = Node.root,\r
                body = r._rawNode,\r
-               i, n = 0, elmProgress = '_xdom_builder_progress';\r
+               elmProgress = '_xdom_builder_progress',\r
+               html;\r
 \r
        /*\r
         * http://support.microsoft.com/kb/812417/ja\r
@@ -95,12 +99,13 @@ X.Dom.DOM_IE4 ?
         * \r
         * body.innerHTML でなく、 body.outerHTML にはできなかった、、、\r
         */\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
        \r
-       X.Dom.asyncParse( body.innerHTML, true )\r
+       X.Dom.asyncParse( html, true )\r
                .listen( X.Event.PROGRESS,\r
-                       function(e){\r
+                       function( e ){\r
                                elmProgress.style.width = ( e.progress * 100 | 0 ) + '%';\r
                        }\r
                )\r