X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F02_dom%2F22_XTreeBuilder.js;h=5a205c742081b5c73ab5cf28d462ee681ffeb1a7;hb=604668ba9efa027d4bc77fd8020d6b6be55d03e1;hp=9e883b2b049159cd7590d541ca38257707361b2a;hpb=42e0982b02a99c71702ce8cd8740645aefdc8097;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/02_dom/22_XTreeBuilder.js b/0.6.x/js/02_dom/22_XTreeBuilder.js index 9e883b2..5a205c7 100644 --- a/0.6.x/js/02_dom/22_XTreeBuilder.js +++ b/0.6.x/js/02_dom/22_XTreeBuilder.js @@ -22,29 +22,31 @@ if( X_UA[ 'MacIE' ] ){ //node.data = ''; l = X_TEMP._removalTextNodes.length; if( parent ){ - //!l && X_Timer_once( 0, X_TEMP._timerRemove ); - //X_TEMP._removalTextNodes[ l ] = node; - //var str=[],p; - //for( p in node ){ - // str[str.length] = p; - //}; - //alert( str.join( ',' ) + parent.innerHTML ); - //node.nodeValue = ''; - //parent.replaceChild( document.createElement( 'span' ), node ); - //var e; - //var f = document.createDocumentFragment(); - //f.appendChild( e = document.createElement( 'span' ) ); - //f.replaceChild( node, e ); - //e.appendChild( f ); - //parent.appendChild( e = document.createElement( 'span' ) ); - //e.appendChild( node ); - //parent.removeChild( e ); - //node.parentNode = null; - //document.body.appendChild( node ); - //parent.replaceChild( document.createComment( '' ), node ); - document.body.appendChild( node ); + /* + !l && X_Timer_once( 0, X_TEMP._timerRemove ); + X_TEMP._removalTextNodes[ l ] = node; + var str=[],p; + for( p in node ){ + str[str.length] = p; + }; + alert( str.join( ',' ) + parent.innerHTML ); + node.nodeValue = ''; + parent.replaceChild( document.createElement( 'span' ), node ); + var e; + var f = document.createDocumentFragment(); + f.appendChild( e = document.createElement( 'span' ) ); + f.replaceChild( node, e ); + e.appendChild( f ); + parent.appendChild( e = document.createElement( 'span' ) ); + e.appendChild( node ); + parent.removeChild( e ); + node.parentNode = null; + X_elmBody.appendChild( node ); + parent.replaceChild( document.createComment( '' ), node ); */ + X_elmBody.appendChild( node ); return; - if( parent.parentNode !== document.body ){ + /* + if( parent.parentNode !== X_elmBody ){ var clone = parent.cloneNode( true ); for( var i = 0, l = parent.childNodes.length; i < l; ++i ){ if( parent.childNodes[ i ] !== node ){ @@ -60,7 +62,7 @@ if( X_UA[ 'MacIE' ] ){ }; } else { // ignore - }; + }; */ }; //if( !node.ownerDocument ) alert( 'no owner' ); @@ -105,11 +107,12 @@ if( X_UA[ 'Opera7' ] ){ * http://kojs.sukobuto.com/docs/visible-binding * IE6 には、「空の span エレメントに続く空白は無視される」という謎な癖があります。 */ -X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, + +X_TEMP._onPreInit = X_UA_DOM.W3C ? (function(){ var r = X_Node_body, - body = r[ '_rawObject' ], + body = X_elmBody, copy, i, l, node, html, elmProgress; @@ -121,8 +124,8 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, // textarea の内容を控えて、消す。xnode tree 構築後に復帰。でないと、html パースでこける //X_UA[ 'MacIE' ] && alert( body.innerHTML ); // cleanup tree - (function/*cleanUpTree*/( elm, skip, head ){ - var nodes = X_Object_cloneArray( elm.childNodes ), + function cleanUpTree( elm, skip ){ + var nodes = X_Array_copy( elm.childNodes ), i = 0, l = nodes.length, node, tag, textNode, content; @@ -132,8 +135,7 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, case 1 : tag = node.tagName.toUpperCase(); if( X_Dom_DTD_MOVE_TO_HEAD[ tag ] ){ - head = head || document.getElementsByTagName( 'head' )[ 0 ]; - head.appendChild( node ); + X_elmHead.appendChild( node ); continue; } else if( X_TEMP._isCleanupTarget( node ) ){ @@ -141,7 +143,7 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, continue; } else { // pre タグ以下はスペースの置換は行わない - node.childNodes && node.childNodes.length && /*cleanUpTree*/arguments.callee( node, skip || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ], head ); + node.childNodes && node.childNodes.length && cleanUpTree( node, skip || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ] ); }; textNode = null; break; @@ -167,7 +169,9 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, //++count; }; }; - })( X_UA[ 'MacIE' ] ? ( copy = body.cloneNode( true ) ) : body ); + }; + + cleanUpTree( X_UA[ 'MacIE' ] ? ( copy = body.cloneNode( true ) ) : body ); if( X_UA[ 'MacIE' ] ){ document.write( html = copy.innerHTML ); @@ -189,28 +193,16 @@ X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, }; }; - body.appendChild( elmProgress = document.createElement( 'div' ) ); + body.appendChild( X_TEMP.elmProgress = elmProgress = document.createElement( 'div' ) ); elmProgress.style.cssText = 'position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;'; elmProgress.setAttribute( 'style', 'position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;' ); X_HTMLParser_asyncParse( html, true ) - [ 'listen' ]( X_EVENT_PROGRESS, - function( e ){ - elmProgress.style.width = ( e.percent * 100 | 0 ) + '%'; - } - ) - [ 'listenOnce' ]( X_EVENT_SUCCESS, - function( e ){ - var xnodes = X_Node_body[ '_xnodes' ] = [], t; - xnodes.push.apply( xnodes, e.xnodes ); - elmProgress.style.width = '100%'; - - X_TEMP.asyncCreateTree( X_Node_body, body.childNodes, elmProgress ); - } - ); + [ 'listen' ]( X_EVENT_PROGRESS, X_TEMP._handleEvent ) + [ 'listenOnce' ]( X_EVENT_SUCCESS, X_TEMP._handleEvent ); }) : -X_UA_DOM.IE4 ? +// X_UA_DOM.IE4 ? (function(){ var r = X_Node_body, body = r[ '_rawObject' ], @@ -218,7 +210,7 @@ X_UA_DOM.IE4 ? html; if( !X_TEMP.X_Dom_useBuilder ) return; - + /* * http://support.microsoft.com/kb/812417/ja * PRB: outerHTML の HTML 要素のプロパティは、既定の属性は表示されません。 @@ -227,30 +219,39 @@ X_UA_DOM.IE4 ? */ html = body.innerHTML; body.insertAdjacentHTML( 'BeforeEnd', '
' ); - elmProgress = document.all[ elmProgress ]; + X_TEMP.elmProgress = document.all[ elmProgress ]; X_HTMLParser_asyncParse( html, true ) - [ 'listen' ]( X_EVENT_PROGRESS, - function( e ){ - elmProgress.style.width = ( e.percent * 100 | 0 ) + '%'; - } - ) - [ 'listenOnce' ]( X_EVENT_SUCCESS, - function( e ){ - var xnodes = X_Node_body[ '_xnodes' ] = [], t; - xnodes.push.apply( xnodes, e.xnodes ); - elmProgress.style.width = '100%'; - - X_TEMP.asyncCreateTree( X_Node_body, body.childNodes || body.children, elmProgress ); - } - ); -}) : -(function(){ + [ 'listen' ]( X_EVENT_PROGRESS, X_TEMP._handleEvent ) + [ 'listenOnce' ]( X_EVENT_SUCCESS, X_TEMP._handleEvent ); +}); + +X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, X_TEMP._onPreInit ); + +X_TEMP._handleEvent = function( e ){ + var elmProgress = X_TEMP.elmProgress, xnodes; -}) ); + switch( e.type ){ + case X_EVENT_PROGRESS : + elmProgress.style.width = ( e.percent * 100 | 0 ) + '%'; + break; + + case X_EVENT_SUCCESS : + xnodes = X_Node_body[ '_xnodes' ] = []; + + xnodes.push.apply( xnodes, e.xnodes ); + elmProgress.style.width = '100%'; + + X_TEMP.asyncCreateTree( X_Node_body, X_elmBody.childNodes || X_elmBody.children, elmProgress ); + + delete X_TEMP._onPreInit; + delete X_TEMP.elmProgress; + break; + }; +}; X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){ - var xnodes = async ? 0 : X_Object_cloneArray( parent[ '_xnodes' ] ), + var xnodes = async ? 0 : X_Array_copy( parent[ '_xnodes' ] ), l = async ? 0 : xnodes.length, stack = async ? async.stack : [], done = async ? async.done : 0, @@ -260,7 +261,7 @@ X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){ xnodes : xnodes, l : l, i : 0, - elems : X_Object_cloneArray( elems ), + elems : X_Array_copy( elems ), j : 0, xtext : null, flag : 0 @@ -291,7 +292,7 @@ X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){ continue; }; - if( startTime + 16 <= X_Timer_now() ){ + if( startTime + X_Timer_INTERVAL_TIME <= X_Timer_now() ){ current.i = i; if( async ){ async.current = i < l && current; @@ -308,8 +309,16 @@ X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){ current = null; }; // complete + console.log( 'xtree 作成完了' ); X_ViewPort[ 'asyncDispatch' ]( X_EVENT_XTREE_READY ); - elmProgress.parentNode ? elmProgress.parentNode.removeChild( elmProgress ) : ( elmProgress.outerHTML = '' ); + + if( X_UA[ 'IE' ] < 6 ){ + // IE5.01 でビルド時間が短い時に removeChild を通るとエラー! + elmProgress.outerHTML = ''; + } else { + elmProgress.parentNode.removeChild( elmProgress ); + }; + delete X_TEMP.asyncCreateTree; delete X_TEMP.bindElementToXnode; delete X_TEMP.X_Dom_useBuilder; @@ -368,13 +377,13 @@ X_TEMP.bindElementToXnode = if( tag.charAt( 0 ) === '/' ) tag = tag.slice( 1 ); xnode[ '_tag' ] = tag; //}; - xnode[ '_flags' ] |= X_Node_State.IN_TREE; + xnode[ '_flags' ] |= X_NodeFlags_IN_TREE; xnode[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; elm[ 'UID' ] = xnode[ '_uid' ]; current.xtext = null; if( tag === 'TEXTAREA' ){ - xnode.attr( 'value', xnode[ 'html' ]() )[ 'empty' ](); + xnode[ 'attr' ]( 'value', xnode[ 'html' ]() )[ 'empty' ](); } else if( elm.childNodes && elm.childNodes.length ){ @@ -384,12 +393,12 @@ X_TEMP.bindElementToXnode = return { me : xnode, - xnodes : X_Object_cloneArray( xnode[ '_xnodes' ] ), + xnodes : X_Array_copy( xnode[ '_xnodes' ] ), xtext : null, flag : 0, i : 0, l : xnode[ '_xnodes' ].length, - elems : X_Object_cloneArray( elm.childNodes ), + elems : X_Array_copy( elm.childNodes ), j : 0, skipCleanup : skipCleanup || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ] }; @@ -404,7 +413,7 @@ X_TEMP.bindElementToXnode = if( elm.nodeType !== 3 ){ if( !( text = xnode[ '_text' ] ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){ console.log( '[' +parent[ '_tag' ] + '> UID:' + xnode[ '_uid' ] + ' len:' + xnode[ '_text' ].length + ' code : ' + xnode[ '_text' ].charCodeAt( 0 ) + ',' + xnode[ '_text' ].charCodeAt( 1 ) + '] destroyed.' ); - xnode.destroy(); + xnode[ 'kill' ](); break; }; alert( parent[ '_tag' ] + ' > ' + '"' + xnode[ '_text' ] + '" !== ' + tag + '\n' + @@ -416,19 +425,19 @@ X_TEMP.bindElementToXnode = ++current.j; xnode[ '_rawObject' ] = elm; - xnode[ '_flags' ] |= X_Node_State.IN_TREE; + xnode[ '_flags' ] |= X_NodeFlags_IN_TREE; xnode[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; xnode[ '_text' ] = elm.data; // 正確 if( !skipCleanup ){ if( !( text = xnode[ '_text' ] ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){ console.log( '[' +parent[ '_tag' ] + '>' + xnode[ '_uid' ] + '] destroy ... ' ); - xnode.destroy(); + xnode[ 'kill' ](); }; if( xtext ){ xtext[ 'text' ]( xtext[ '_text' ] + text ); console.log( '[' +parent[ '_tag' ] + '>' + xnode[ '_uid' ] + '] xtext,destroy ... ' ); - xnode.destroy(); + xnode[ 'kill' ](); } else { //alert( parent[ '_tag' ] + '>' + '"' + text + '"\n' + elm.data ); xnode[ 'text' ]( text ); @@ -437,7 +446,7 @@ X_TEMP.bindElementToXnode = if( xtext ){ xtext[ 'text' ]( xtext[ '_text' ] + xnode[ '_text' ] ); console.log( '[' +parent[ '_tag' ] + '>' + xnode[ '_uid' ] + '] xtext,destroy ... ' ); - xnode.destroy(); + xnode[ 'kill' ](); }; current.xtext = xtext || xnode; break; @@ -454,18 +463,18 @@ X_TEMP.bindElementToXnode = xnode.parent = parent; if( !xnode[ '_tag' ] ){ - xnode[ '_flags' ] |= X_Node_State.IN_TREE; + xnode[ '_flags' ] |= X_NodeFlags_IN_TREE; xnode[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; //alert( X_String_cleanupWhiteSpace( xnode[ '_text' ] ) ); if( !skipCleanup ){ if( !( text = xnode[ '_text' ] ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){ - xnode.destroy(); + xnode[ 'kill' ](); xnode = null; } else if( xtext ){ //alert( 'xtext ' + text.charCodeAt( 0 ) + ' : ' + text.length ); xtext[ 'text' ]( xtext[ '_text' ] + text ); - xnode.destroy(); + xnode[ 'kill' ](); } else { //alert( 'xnode ' + text.charCodeAt( 0 ) + ' : ' + text.length ); xnode[ 'text' ]( text ); @@ -474,11 +483,11 @@ X_TEMP.bindElementToXnode = if( xtext ){ //alert( 'skip ' + text.charCodeAt( 0 ) + ' : ' + text.length ); xtext[ 'text' ]( xtext[ '_text' ] + xnode[ '_text' ] ); - xnode.destroy(); + xnode[ 'kill' ](); }; }; current.xtext = xtext || xnode; - parent[ '_flags' ] |= X_Node_State.IE4_HAS_TEXTNODE; + parent[ '_flags' ] |= X_NodeFlags_IE4_HAS_TEXTNODE; return; }; @@ -498,11 +507,11 @@ X_TEMP.bindElementToXnode = ++current.j; xnode[ '_rawObject' ] = elm; - xnode[ '_flags' ] |= X_Node_State.IN_TREE; + xnode[ '_flags' ] |= X_NodeFlags_IN_TREE; xnode[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; //xnode[ '_tag' ] = X_Dom_DTD_TAG_FIX[ tag ] || tag; if( X_TEMP._isCleanupTarget( elm ) ){ //!xnode[ 'hasClass' ]( 'skip-cleanup' ) && ( X_Dom_DTD_CLEANUP_TAGS[ tag ] || xnode[ 'hasClass' ]( 'cleanup-target' ) ) ){ - xnode.destroy(); + xnode[ 'kill' ](); break; }; @@ -514,21 +523,21 @@ X_TEMP.bindElementToXnode = ( xnode[ '_attrs' ] = { type : 'text' } ) : xnode[ '_attrs' ].type || ( xnode[ '_attrs' ].type = 'text' ) ); - parent[ '_flags' ] |= X_Node_State.IE4_HAS_ELEMENT; + parent[ '_flags' ] |= X_NodeFlags_IE4_HAS_ELEMENT; current.xtext = null; if( tag === 'TEXTAREA' ){ - xnode.attr( 'value', xnode[ 'html' ]() )[ 'empty' ](); + xnode[ 'attr' ]( 'value', xnode[ 'html' ]() )[ 'empty' ](); } else if( xnode[ '_xnodes' ] && xnode[ '_xnodes' ].length ){ return { me : xnode, - xnodes : X_Object_cloneArray( xnode[ '_xnodes' ] ), + xnodes : X_Array_copy( xnode[ '_xnodes' ] ), xtext : null, flag : 0, i : 0, l : xnode[ '_xnodes' ].length, - elems : X_Object_cloneArray( elm.children ), + elems : X_Array_copy( elm.children ), j : 0, skipCleanup : skipCleanup || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ] };