X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F02_dom%2F20_XNode.js;h=bb392e322246062eabf787fe4415fac385d10bc3;hb=ef25747bebf1799d49f9bd0d64e339da9ea61d13;hp=81c33fab01ecb2a313cde9ec04152e1ce9d95928;hpb=a205577d1e16a34301f1199dcf9c699aa2c37fb9;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/02_dom/20_XNode.js b/0.6.x/js/02_dom/20_XNode.js index 81c33fa..bb392e3 100644 --- a/0.6.x/js/02_dom/20_XNode.js +++ b/0.6.x/js/02_dom/20_XNode.js @@ -155,7 +155,8 @@ var Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ]( var uid = X_Node_CHASHE.length, css, xnodes, xnode, parent; - if( X_Node_newByTag ){ + // TODO 継承クラスで this.Super('DIV') ができない! -> サブクラスから呼ばれた場合も + if( X_Node_newByTag || this.constructor !== Node ){ X_Node_newByTag = false; this[ '_tag' ] = v.toUpperCase(); arguments[ 1 ] && this[ 'attr' ]( arguments[ 1 ] ); @@ -223,6 +224,7 @@ var Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ]( X_Node_CHASHE[ this[ '_uid' ] = uid ] = this; }, + // TODO .mesure() -> X.Event.MESURED 'width' : X_Node_width, 'height' : X_Node_height, 'clientWidth' : X_Node_clientWidth, @@ -253,6 +255,8 @@ var Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ]( 'createTextAt' : X_Node_createTextAt, + 'createRange' : X_Node_createRange, + 'clone' : X_Node_clone, 'append' : X_Node_append, @@ -289,7 +293,7 @@ var Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ]( 'toggleClass' : X_Node_toggleClass, 'hasClass' : X_Node_hasClass, - 'html' : X_Node_html, + 'html' : X_Node__html, 'text' : X_Node_text, 'call' : X_Node_call, 'each' : X_Node_each @@ -360,6 +364,7 @@ function X_Node_getType( v ){ if( X_Type_isString( v ) ){ return '<' === v.charAt( 0 ) && v.charAt( v.length - 1 ) === '>' ? X_NodeType_HTML_STRING : X_NodeType_STRING; }; + // Node サブクラスのインスタンス if( v[ 'instanceOf' ] && v[ 'instanceOf' ]( Node ) ) return X_NodeType_XNODE; return 0; }; @@ -494,6 +499,15 @@ function X_Node_createTextAt( index, text ){ }; /** + * 選択されたテキストへの参照やテキスト座標情報 + * @alias Node.prototype.createRange + * @return {TextRange} 新規作成されたテキストレンジ + */ +function X_Node_createRange( a, b, c ){ + return X_TextRange( this, a, b, c ); +}; + +/** * Node のクローンを作成し返す。id もクローンされる点に注意。イベントリスナはクローンされない。 * http://d.hatena.ne.jp/think49/20110724/1311472811 * http://d.hatena.ne.jp/uupaa/20100508/1273299874 @@ -1103,14 +1117,14 @@ function X_Node_hasClass( v ){ * @return {string|Node} * @example node.html( '' ); */ -function X_Node_html( html ){ +function X_Node__html( html ){ var _ = '', q = '"', xnodes, n, i, l; // setter if( html !== undefined ){ // String 以外に Number や false null なども許可 if( !this[ '_tag' ] ) return this[ 'text' ]( html ); this[ 'empty' ](); - if( html ){ + if( html += '' ){ X_Node_append.apply( this, X_HtmlParser_parse( html, true ) ); }; return this; @@ -1202,7 +1216,7 @@ function X_Node_call( name /*, opt_args... */ ){ var args = arguments, l = args.length - 1, v, raw, parent, body, - childX, childY, childW, childH, + child, childX, childY, childW, childH, parentW, parentH, parentSX, parentSY, parentSW, parentSH, visibleX, visibleY, visibleW, visibleH, @@ -1258,6 +1272,7 @@ function X_Node_call( name /*, opt_args... */ ){ }; if( name === 'inView' ){ + if( !( this[ '_flags' ] & X_NodeFlags_IN_TREE ) ) return { 'isInView' : false }; body = X_elmBody; child = raw; visibleX = visibleY = visibleW = visibleH = 0; @@ -1367,7 +1382,7 @@ function X_Node_reserveUpdate(){ var X_Node_updateReservedByReleaseGPU = false; function X_Node_startUpdate( time ){ - var removal, i, xnodeOrElm, xnodesIEFilterFixAfter, xnode; + var removal, i, xnodeOrElm, xnodesIEFilterFixAfter, xnode, active; if( !X_Node_updateTimerID || X_ViewPort_readyState < X_EVENT_INIT ){ return; @@ -1407,12 +1422,24 @@ function X_Node_startUpdate( time ){ removal.length = 0; }; + // 強制的に再描画を起こす, 但し activeElement からフォーカスが外れるため復帰する + // IE5mode win10 で 確認 + if( X_UA[ 'IE5' ] ){ + active = document.activeElement; + X_elmBody.style.visibility = 'hidden'; + }; + if( X_Node_html[ '_flags' ] & X_Node_BitMask_IS_DIRTY ){ X_Node__commitUpdate( X_Node_html, X_Node_html[ '_rawObject' ].parentNode, null, X_Node_html[ '_flags' ], 1, xnodesIEFilterFixAfter = [] ); } else { X_Node__commitUpdate( X_Node_head, X_Node_head[ '_rawObject' ].parentNode, null, X_Node_head[ '_flags' ], 1, xnodesIEFilterFixAfter = [] ); X_Node__commitUpdate( X_Node_body, X_Node_body[ '_rawObject' ].parentNode, null, X_Node_body[ '_flags' ], 1, xnodesIEFilterFixAfter = [] ); }; + + if( X_UA[ 'IE5' ] ){ + X_elmBody.style.visibility = ''; + active && active.parentNode && active.focus(); + }; if( X_Node_updateReservedByReleaseGPU ){ X_Node_reserveUpdate(); @@ -1448,13 +1475,13 @@ function X_Node_startUpdate( time ){ */ var X_Node__commitUpdate = X_UA_DOM.W3C ? - ( function( that, parentElement, nextElement, accumulatedFlags, ie8opacity, xnodesIEFilterFixAfter ){ + ( function( that, parentElement, nextElement, accumulatedFlags, ie8AccumulatedOpcity, xnodesIEFilterFixAfter ){ var elm = that[ '_rawObject' ], - created, xnodes, l, next, anime, v; + created, xnodes, l, next, anime, v, currentOpcity; // 1. GPU 一切の更新をスキップ if( that[ '_flags' ] & X_NodeFlags_GPU_NOW ){ - console.log( '更新のskip ' + !!( that[ '_flags' ] & X_Node_BitMask_IS_DIRTY ) ); + console.log( '更新のskip ' + that[ '_className' ] + !!( that[ '_flags' ] & X_Node_BitMask_IS_DIRTY ) ); that[ '_flags' ] & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm ); return elm; }; @@ -1502,7 +1529,12 @@ var X_Node__commitUpdate = if( !elm ){ if( !that[ '_tag' ] ){ that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; - elm = document.createTextNode( X_String_chrReferanceTo( that[ '_text' ] ) ); + if( X_UA[ 'IE' ] < 8 ){ + // \n -> \r\n に変換しないと pre タグで開業されない win10ie7(ie11 emu) で確認 + elm = document.createTextNode( X_String_chrReferanceTo( that[ '_text' ] ).split( '\n' ).join( X_String_CRLF ) ); + } else { + elm = document.createTextNode( X_String_chrReferanceTo( that[ '_text' ] ) ); + }; if( !X_UA[ 'IE' ] ){ elm[ 'UID' ] = that[ '_uid' ]; }; @@ -1583,12 +1615,13 @@ var X_Node__commitUpdate = }; // ie8 では子要素に opacity が反映されないため、親要素の opacity を積算する - ie8opacity = ie8opacity * ( that[ '_css' ] && 0 <= that[ '_css' ].opacity ? that[ '_css' ].opacity : 1 ); + currentOpcity = that[ '_css' ] && 0 <= that[ '_css' ].opacity && that[ '_css' ].opacity; + ie8AccumulatedOpcity = ie8AccumulatedOpcity * ( currentOpcity || 1 ); // 8. 更新の適用 if( accumulatedFlags & X_Node_BitMask_IS_DIRTY ){ delete that[ '_fontSize' ]; - X_Node__updateRawNode( that, elm, ie8opacity, accumulatedFlags ); + X_Node__updateRawNode( that, elm, currentOpcity, ie8AccumulatedOpcity, accumulatedFlags ); }; // 9. ie5 only @@ -1612,7 +1645,7 @@ var X_Node__commitUpdate = // 10. 子要素の更新。 if( ( xnodes = that[ '_xnodes' ] ) && ( l = xnodes.length ) ) { for( ; l; ){ - next = X_Node__commitUpdate( xnodes[ --l ], elm, next, accumulatedFlags, ie8opacity, xnodesIEFilterFixAfter ); + next = X_Node__commitUpdate( xnodes[ --l ], elm, next, accumulatedFlags, ie8AccumulatedOpcity, xnodesIEFilterFixAfter ); }; }; @@ -1627,7 +1660,8 @@ var X_Node__commitUpdate = }; }; - if( ( anime = that[ '_anime' ] ) && 6 <= anime.phase && anime.doScroll ){ +/* + * if( ( anime = that[ '_anime' ] ) && 6 <= anime.phase && anime.doScroll ){ if( anime.phase === 6 ){ v = anime.fromScrollX; if( v === v ){ @@ -1646,13 +1680,14 @@ var X_Node__commitUpdate = elm.scrollTop = anime.scrollY; }; }; + */ return elm; }) : X_UA_DOM.IE4 ? ( function( that, parentElement, prevElement, accumulatedFlags ){ var elm = that[ '_rawObject' ] || X_Node__ie4getRawNode( that ), - xnodes, l, i, dirty, mix, html, text, prev; + xnodes, l, i, dirty, mix, html, text, prev, anime, v; if( !that[ '_tag' ] ){ that[ '_flags' ] & X_NodeFlags_DIRTY_CONTENT && X_Node__updateRawNode( that, elm ); @@ -1769,13 +1804,18 @@ var X_Node__commitUpdate = */ var X_Node__updateRawNode = X_UA_DOM.W3C ? - ( function( that, elm, ie8opacity, accumulatedFlags ){ + ( function( that, elm, currentOpcity, ie8AccumulatedOpcity, accumulatedFlags ){ var // flags = that[ '_flags' ], - attrs, rename, k, v, memory, f; + attrs, rename, k, v, f; // textNode if( !that[ '_tag' ] ){ - elm.data = X_String_chrReferanceTo( that[ '_text' ] ); + if( X_UA[ 'IE' ] < 8 ){ + // \n -> \r\n に変換しないと pre タグで開業されない win10ie7(ie11 emu) で確認 + elm.data = X_String_chrReferanceTo( that[ '_text' ] ).split( '\n' ).join( X_String_CRLF ); + } else { + elm.data = X_String_chrReferanceTo( that[ '_text' ] ); + }; that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; return; }; @@ -1796,7 +1836,7 @@ var X_Node__updateRawNode = elm.setAttribute( 'class', that[ '_className' ] ) : ( elm.className = that[ '_className' ] ) ) : - ( elm.className && elm.removeAttribute( X_UA[ 'IE' ] < 8 ? 'className' : 'class' ) ); // className は ie7- + ( elm.className && elm.removeAttribute( X_UA[ 'IE' ] < 8 ? 'className' : 'class' ) ); // className は ie7- }; // attr @@ -1847,11 +1887,9 @@ var X_Node__updateRawNode = }; if( accumulatedFlags & X_NodeFlags_IE8_OPACITY_FIX ){ - memory = that[ '_css' ] && that[ '_css' ].opacity; - f = true; - if( 0 <= memory && memory < 1 ){ - //if( !that[ '_css' ] ) that[ '_css' ] = {}; - that[ '_css' ].opacity = ie8opacity; + if( 0 <= currentOpcity ){ + f = true; + that[ '_css' ].opacity = ie8AccumulatedOpcity; if( that[ '_flags' ] & X_NodeFlags_DIRTY_CSS ){ that[ '_flags' ] |= X_NodeFlags_OLD_CSSTEXT; } else @@ -1889,13 +1927,7 @@ var X_Node__updateRawNode = * IE8でfilter:alphaの指定がposition:relative,position:absoluteの子要素に継承されない問題 */ if( f ){ - if( 0 <= memory ){ - that[ '_css' ].opacity = memory; - } else { - //elm.style.filter = 'inherit'; - //delete that[ '_css' ].opacity; - //if( X_Object_isEmpty( that[ '_css' ] ) ) delete that[ '_css' ]; - }; + that[ '_css' ].opacity = currentOpcity; }; that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY;