X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F02_dom%2F20_XNode.js;h=b775d71b746e71537b42ef4de9264a4510bc2d4d;hb=241005e2a5f9f8a7fddd6f610b76a915e9c05d30;hp=aad360f28ed97abb02447e3867d8802bd180ecc6;hpb=733b1bb359e89b077ad347a5737b4cd610f0a8cb;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 aad360f..b775d71 100644 --- a/0.6.x/js/02_dom/20_XNode.js +++ b/0.6.x/js/02_dom/20_XNode.js @@ -787,8 +787,7 @@ function X_Node_remove(){ this[ '_xnodes' ] && X_Node_toggleInTreeFlag( this[ '_xnodes' ], false ); if( X_UA_DOM.IE4 ){ - elm = this[ '_rawObject' ] || X_Node__ie4getRawNode( this ); - if( elm ){ + if( elm = this[ '_rawObject' ] || X_Node__ie4getRawNode( this ) ){ X_Node_reserveRemoval[ X_Node_reserveRemoval.length ] = this; X_Node_reserveUpdate(); } else @@ -802,6 +801,14 @@ function X_Node_remove(){ X_Node_reserveUpdate(); }; }; + } else { + if( !X_UA_DOM.IE4 ){ + elm = this[ '_rawObject' ]; + if( elm && elm.parentNode && elm.parentNode.tagName ){ + X_Node_reserveRemoval[ X_Node_reserveRemoval.length ] = this; + X_Node_reserveUpdate(); + }; + }; }; return this; }; @@ -1174,10 +1181,20 @@ function X_Node_text( text ){ * @example node.call( 'focus' ); */ function X_Node_call( name /*, opt_args... */ ){ - var l = arguments.length - 1, - v, raw, func, args, params, i; + var args = arguments, + l = args.length - 1, + v, raw, parent, body, + childX, childY, childW, childH, + parentW, parentH, + parentSX, parentSY, parentSW, parentSH, + visibleX, visibleY, visibleW, visibleH, + visiblePartX, visiblePartY, func, args, params, i; switch( name ){ + case 'isSVG' : + return !!( this[ '_flags' ] & X_NodeFlags_IS_SVG ); + case 'isVML' : + return !!( this[ '_flags' ] & X_NodeFlags_IS_VML ); case 'nodeType' : return this[ '_tag' ] ? 1 : 3; case 'outerHTML' : @@ -1196,28 +1213,79 @@ function X_Node_call( name /*, opt_args... */ ){ X_Node_updateTimerID && X_Node_startUpdate(); raw = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); + if( !raw ) return; if( name === 'scrollTo' ){ - raw.scrollLeft = arguments[ 1 ] || 0; - raw.scrollTop = arguments[ 2 ] || 0; + raw.scrollLeft = args[ 1 ] || 0; + raw.scrollTop = args[ 2 ] || 0; return; }; + if( name === 'inView' ){ + body = X_elmBody; + child = raw; + visibleX = visibleY = visibleW = visibleH = 0; + while( child !== body ){ + parent = child.parentNode || child.parentElement; + parentH = parent.clientHeight; + parentW = parent.clientWidth; + parentSW = parent.scrollHeight; + parentSH = parent.scrollWidth; + // 親がスクロール領域を持つ + if( parentH < parentSH || parentW < parentSW ){ + childX = child.offsetLeft + visibleX; + childY = child.offsetTop + visibleY; + childW = visibleW || child.offsetWidth; + childH = visibleH || child.offsetHeight; + parentSX = parent.scrollLeft; + parentSY = parent.scrollTop; + // 子が表示領域内 + if( parentSY < childY + childH && + childY < parentSY + parentH && + parentSX < childX + childW && + childX < parentSX + parentW ){ + + // right:子の左側が見えている left:子の左側が見えている both:完全に見えている + visiblePartX = + childX < parentSX ? 'right' : + ( parentSX + parentW ) < ( childX + childW ) ? 'left' : 'both'; + visiblePartY = + childY < parentSY ? 'bottom' : + ( parentSY + parentH ) < ( childY + childH ) ? 'top' : 'both'; + + // 子が見える領域 + visibleX = visiblePartX === 'right' ? 0 : childX - parentSX; + visibleY = visiblePartX === 'bottom' ? 0 : childY - parentSY; + visibleW = + visiblePartX === 'both' ? childW : + visiblePartX === 'right' ? ( parentSX + parentW - childX ) : ( childX + childW - parentSX ); + visibleH = + visiblePartY === 'both' ? childH : + visiblePartY === 'bottom' ? ( parentSY + parentH - childY ) : ( childY + childH - parentSY ); + } else { + return { 'isInView' : false }; + }; + }; + child = parent; + }; + return { 'isInView' : true }; + }; + func = raw[ name ]; if( X_Type_isFunction( func ) ){ if( l ){ - args = X_Array_copy( arguments ); + args = X_Array_copy( args ); args.shift(); return func.apply( raw, args ); }; return raw[ name ](); } else - if( X_Type_isUnknown( func ) || ( X_UA[ 'IE' ] < 9 && X_Type_isObject( func ) ) ){ + if( X_UA[ 'IE' ] < 9 && ( X_Type_isUnknown( func ) || X_Type_isObject( func ) ) ){ // typeof func === unknown に対策 // http://la.ma.la/blog/diary_200509031529.htm if( l ){ - args = X_Array_copy( arguments ); + args = X_Array_copy( args ); args.shift(); params = []; @@ -1393,7 +1461,7 @@ var X_Node__commitUpdate = if( !elm ){ if( !that[ '_tag' ] ){ that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; - that[ '_rawObject' ] = elm = document.createTextNode( X_String_chrReferanceTo( that[ '_text' ] ) ); + elm = document.createTextNode( X_String_chrReferanceTo( that[ '_text' ] ) ); if( !X_UA[ 'IE' ] ){ elm[ 'UID' ] = that[ '_uid' ]; }; @@ -1401,7 +1469,7 @@ var X_Node__commitUpdate = if( X_Node_strictElmCreation ){ that[ '_flags' ] & X_NodeFlags_OLD_CSSTEXT && X_Node_CSS_objToCssText( that, true ); // OLD_CSSTEXT ?? - that[ '_rawObject' ] = elm = + elm = document.createElement( [ '<', that[ '_tag' ], ' UID="', that[ '_uid' ], '"', @@ -1410,14 +1478,15 @@ var X_Node__commitUpdate = X_Node_Attr_objToAttrText( that, true ), that[ '_cssText' ] ? ' style="' + that[ '_cssText' ] + '"' : '', '>' ].join( '' ) ); + } else + if( that[ '_flags' ] & X_NodeFlags_IS_SVG ){ + elm = document.createElementNS( 'http://www.w3.org/2000/svg', that[ '_tag' ].toLowerCase() ); } else { - if( that[ '_flags' ] & X_NodeFlags_IS_SVG ){ - that[ '_rawObject' ] = elm = document.createElementNS( 'http://www.w3.org/2000/svg', that[ '_tag' ] ); - } else { - that[ '_rawObject' ] = elm = document.createElement( that[ '_tag' ] ); - }; + elm = document.createElement( that[ '_tag' ] ); }; + that[ '_rawObject' ] = elm; + // IE には要素追加のタイミングで起こるメモリリークがありここで追加 if( !X_Node_addTreeAfterChildren ){ nextElement ? @@ -1429,10 +1498,10 @@ var X_Node__commitUpdate = X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰 that[ '_flags' ] |= X_NodeFlags_ACTUAL_LISTENING; - if( X_Node_documentFragment ){ + //if( X_Node_documentFragment ){ //( frg = X_Node_documentFragment ).appendChild( elm ); // 連続する要素の差し替えの場合に有効 - }; + //}; if( X_Node_strictElmCreation ){ that[ '_flags' ] &= X_Node_BitMask_RESET_DIRTY; @@ -1619,11 +1688,21 @@ var X_Node__updateRawNode = }; // id if( that[ '_flags' ] & X_NodeFlags_DIRTY_ID ){ - that[ '_id' ] ? ( elm.id = that[ '_id' ] ) : ( elm.id && elm.removeAttribute( 'id' ) ); + that[ '_id' ] ? + ( ( that[ '_flags' ] & X_NodeFlags_IS_SVG ) ? + elm.setAttribute( 'id', that[ '_id' ] ) : + ( elm.id = that[ '_id' ] ) + ) : + ( elm.id && elm.removeAttribute( 'id' ) ); }; // className if( that[ '_flags' ] & X_NodeFlags_DIRTY_CLASSNAME ){ - that[ '_className' ] ? ( elm.className = that[ '_className' ] ) : ( elm.className && elm.removeAttribute( X_UA[ 'IE' ] < 8 ? 'className' : 'class' ) ); // className は ie7- + that[ '_className' ] ? + ( ( that[ '_flags' ] & X_NodeFlags_IS_SVG ) ? + elm.setAttribute( 'class', that[ '_className' ] ) : + ( elm.className = that[ '_className' ] ) + ) : + ( elm.className && elm.removeAttribute( X_UA[ 'IE' ] < 8 ? 'className' : 'class' ) ); // className は ie7- }; // attr @@ -1665,7 +1744,10 @@ var X_Node__updateRawNode = // TODO IE では input, なぜか button, object も type, name の変更が出来ない、同値で置き換えようとしても不可 v === undefined ? elm.removeAttribute( rename[ k ] || k ) : - ( elm[ rename[ k ] || k ] = X_Node_Attr_noValue[ k ] ? k : v ); + ( ( that[ '_flags' ] & X_NodeFlags_IS_SVG ) ? + elm.setAttribute( k, v ) : + ( elm[ rename[ k ] || k ] = X_Node_Attr_noValue[ k ] ? k : v ) + ); }; delete that[ '_newAttrs' ]; };