X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F02_dom%2F22_XTreeBuilder.js;h=72eae6bda6633a21ec343386b27ec07a863d3c57;hb=e28511741c97176b8ffe67bb1ea0660da37f754b;hp=ed573078a423b736637b230270d4ae09340dbff5;hpb=83a329e3210a40f383282389a48a33ea34ccfa1f;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 ed57307..72eae6b 100644 --- a/0.6.x/js/02_dom/22_XTreeBuilder.js +++ b/0.6.x/js/02_dom/22_XTreeBuilder.js @@ -22,26 +22,27 @@ 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 ); + /* + !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 ); return; if( parent.parentNode !== document.body ){ @@ -105,7 +106,8 @@ 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, @@ -121,8 +123,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, head ){ + var nodes = X_Array_copy( elm.childNodes ), i = 0, l = nodes.length, node, tag, textNode, content; @@ -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 ], head ); }; 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,18 @@ 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._body = body; - X_TEMP.asyncCreateTree( X_Node_body, body.childNodes, elmProgress ); - } - ); + X_HTMLParser_asyncParse( html, true ) + [ '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 +212,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 +221,42 @@ X_UA_DOM.IE4 ? */ html = body.innerHTML; body.insertAdjacentHTML( 'BeforeEnd', '
' ); - elmProgress = document.all[ elmProgress ]; + X_TEMP.elmProgress = document.all[ elmProgress ]; + + X_TEMP._body = body; 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_TEMP._body.childNodes || X_TEMP._body.children, elmProgress ); + + delete X_TEMP._onPreInit; + delete X_TEMP._body; + 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 +266,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 @@ -311,6 +317,7 @@ X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){ console.log( 'xtree 作成完了' ); X_ViewPort[ 'asyncDispatch' ]( X_EVENT_XTREE_READY ); elmProgress.parentNode ? elmProgress.parentNode.removeChild( elmProgress ) : ( elmProgress.outerHTML = '' ); + delete X_TEMP.asyncCreateTree; delete X_TEMP.bindElementToXnode; delete X_TEMP.X_Dom_useBuilder; @@ -369,7 +376,7 @@ 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; @@ -385,12 +392,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 ] }; @@ -405,7 +412,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' + @@ -417,19 +424,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 ); @@ -438,7 +445,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; @@ -455,18 +462,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 ); @@ -475,11 +482,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; }; @@ -499,11 +506,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; }; @@ -515,7 +522,7 @@ 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' ){ @@ -524,12 +531,12 @@ X_TEMP.bindElementToXnode = 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 ] };