X_Node_documentFragment = document.createDocumentFragment && ( !X_UA.IE || 5.5 <= X_UA.IE ) && document.createDocumentFragment(),\r
\r
// 子の生成後に リアル文書 tree に追加する\r
- X_Node_addTreeAfterChildren = false,\r
+ X_Node_addTreeAfterChildren = !( X.UA.IE < 9 ),\r
\r
X_Node_displayNoneFixForIE5 = !!X_Node_State.IE5_DISPLAY_NONE_FIX,\r
\r
X_UA_DOM.W3C ?\r
( function( that, parentElement, nextElement, accumulatedFlags ){\r
var elm = that._rawObject,\r
- xnodes, l, next;\r
+ created, xnodes, l, next;\r
\r
// 1. GPU 一切の更新をスキップ\r
if( that._flags & X_Node_State.GPU_NOW ){\r
// 5. ie5 非表示fixフラグ\r
accumulatedFlags |= that._flags;\r
\r
- if( that._flags & X_Node_State.IE5_DISPLAY_NONE_FIX && ( accumulatedFlags & ( X_Node_State.DIRTY_POSITION | X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME ) === 0 ) ) return nextElement;\r
- \r
+ if( that._flags & X_Node_State.IE5_DISPLAY_NONE_FIX ){\r
+ if( accumulatedFlags & ( X_Node_State.DIRTY_POSITION | X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME ) === 0 ){\r
+ return nextElement;\r
+ };\r
+ \r
+ };\r
\r
// 6. 要素の生成\r
if( !elm ){\r
- nextElement ?\r
- parentElement.insertBefore( X_Node__actualCreate( that, false ), nextElement ) :\r
- parentElement.appendChild( X_Node__actualCreate( that, false ) );\r
- return X_Node__afterActualCreate( that ) || X_Node_displayNoneFixForIE5 && nextElement; // ie5 だけこの位置で _rawObject が空の場合がある\r
- // X_Node__actualCreate, X_Node__afterActualCreate の処理をこちら側に。\r
- };\r
- \r
+ if( !that._tag ){\r
+ that._flags &= X_Node_BitMask_RESET_DIRTY;\r
+ that._rawObject = elm = document.createTextNode( X_String_chrReferanceTo( that._text ) );\r
+ } else\r
+ if( X_Node_strictElmCreation ){\r
+ that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true );\r
+ \r
+ that._rawObject = elm =\r
+ document.createElement( [\r
+ '<', that._tag,\r
+ ' UID="', that._uid, '"',\r
+ that._id ? ' id="' + that._id + '"' : '',\r
+ that._className ? ' class="' + that._className + '"' : '',\r
+ that._flags & X_Node_State.OLD_ATTRTEXT ? X_Node_Attr_objToAttrText( that ) : that._attrText,\r
+ that._cssText ? ' style="' + that._cssText + '"' : '',\r
+ '>' ].join( '' ) ); \r
+ } else {\r
+ that._rawObject = elm = document.createElement( that._tag );\r
+ };\r
+ \r
+ // IE には要素追加のタイミングで起こるメモリリークがありここで追加\r
+ if( !X_Node_addTreeAfterChildren ){\r
+ nextElement ?\r
+ parentElement.insertBefore( elm, nextElement ) :\r
+ parentElement.appendChild( elm );\r
+ //elm.UID = that._uid;\r
+ // src の onload があるので先ではないか?\r
+ // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
+ X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
+ };\r
+\r
+ if( that._tag ){\r
+ if( X_Node_documentFragment ){\r
+ //( frg = X_Node_documentFragment ).appendChild( elm );\r
+ };\r
+\r
+ if( X_Node_strictElmCreation ){\r
+ // TODO src 等の設定\r
+ delete that._newAttrs;\r
+ that._flags &= X_Node_BitMask_RESET_DIRTY;\r
+ that._flags |= X_Node_State.DIRTY_IE_FILTER;// doc 追加後に filter を指定しないと有効にならない。\r
+ } else {\r
+ elm.UID = that._uid;\r
+ that._newAttrs = that._attrs;\r
+ that._flags |= X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME | X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_CSS | X_Node_State.DIRTY_IE_FILTER;\r
+ \r
+ // http://outcloud.blogspot.jp/2010/09/iframe.html\r
+ // この問題は firefox3.6 で確認\r
+ if( X_UA.Gecko ){\r
+ if( that._tag === 'IFRAME' && !that._attrs[ 'src' ] ){\r
+ //elm.contentWindow.location.replace = elm.src = 'about:blank';\r
+ that.attr( 'src', 'about:blank' );\r
+ };\r
+ };\r
+ };\r
+ };\r
+ \r
+ created = true;\r
+ } else\r
// 7. 要素の位置のズレを補正\r
if( elm.parentNode !== parentElement || ( nextElement && elm.nextSibling !== nextElement ) ){\r
nextElement ?\r
parentElement.insertBefore( elm, nextElement ) :\r
parentElement.appendChild( elm );\r
+\r
+ if( X_Node_displayNoneFixForIE5 ) that._flags |= X_Node_State.DIRTY_POSITION;\r
};\r
+ \r
+ that._flags & X_Node_State.DIRTY_POSITION && X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
that._flags &= ~X_Node_State.DIRTY_POSITION;\r
\r
// 8. 更新の適用\r
};\r
};\r
\r
+ if( created && X_Node_addTreeAfterChildren ){\r
+ nextElement ?\r
+ parentElement.insertBefore( elm, nextElement ) :\r
+ parentElement.appendChild( elm );\r
+ \r
+ X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
+ };\r
+\r
return elm;\r
}) :\r
X_UA_DOM.IE4 ? \r
that._className ? ( elm.className = that._className ) : ( elm.className && elm.removeAttribute( X_UA.IE5678 ? 'className' : 'class' ) ); // className は ie7-? \r
};\r
\r
- that._tag === 'TEXTAREA' && console.log( that.call('outerHTML') );\r
- \r
// attr\r
if( that._flags & X_Node_State.DIRTY_ATTR && ( attrs = that._newAttrs || that._attrs ) ){\r
rename = X_Node_Attr_renameForDOM;\r
- \r
- // IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので\r
- if( !X_UA.MacIE && X_UA.IE5x && that._tag === 'TEXTAREA' && ( ( v = attrs[ 'value' ] ) || X_Object_inObject( 'value', attrs ) ) ){\r
- delete attrs[ 'value' ];\r
- elm.firstChild ?\r
- ( elm.firstChild.data = v || '' ) :\r
- elm.appendChild( document.createTextNode( v || '' ) );\r
- };\r
- // http://outcloud.blogspot.jp/2010/09/iframe.html\r
- // この問題は firefox3.6 で確認\r
- if( X_UA.Gecko && that._tag === 'IFRAME' && ( ( v = attrs[ 'src' ] ) || X_Object_inObject( 'src', attrs ) ) ){\r
- elm.contentWindow.location.replace = elm.src = v || '';\r
- delete attrs[ 'src' ];\r
- };\r
\r
for( k in attrs ){\r
+ v = attrs[ k ];\r
+ \r
+ switch( that._tag + k ){\r
+ case 'TEXTAREAvalue' :\r
+ // IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので\r
+ if( !X_UA.MacIE && X_UA.IE5x ){\r
+ elm.firstChild ?\r
+ ( elm.firstChild.data = v || '' ) :\r
+ elm.appendChild( document.createTextNode( v || '' ) );\r
+ continue;\r
+ };\r
+ break;\r
+ \r
+ case 'IFRAMEsrc' :\r
+ // http://outcloud.blogspot.jp/2010/09/iframe.html\r
+ // この問題は firefox3.6 で確認\r
+ if( X_UA.Gecko ){\r
+ elm.contentWindow.location.replace = elm.src = v || '';\r
+ continue;\r
+ };\r
+ break;\r
+ \r
+ case 'IFRAMEname' :\r
+ // http://d.hatena.ne.jp/NeoCat/20080921/1221940658\r
+ // こちらに名前をsetしないとtargetが動作しない\r
+ // if( X_UA.IE ) elm.name = elm.contentWindow.name = v || '';\r
+ };\r
+ \r
//if( X_EMPTY_OBJECT[ k ] ) continue;\r
// TODO IE では input, なぜか button, object も type, name の変更が出来ない、同値で置き換えようとしても不可\r
- ( v = attrs[ k ] ) === undefined ?\r
+ v === undefined ?\r
elm.removeAttribute( rename[ k ] || k ) :\r
( elm[ rename[ k ] || k ] = X_Node_Attr_noValue[ k ] ? k : v );\r
};\r
};\r
} else\r
if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
- elm.style.filter = v = X_Node_CSS_objToIEFilterText( that );\r
+ v = X_Node_CSS_objToIEFilterText( that );\r
if( v ){\r
+ elm.style.filter = v;\r
that._flags |= X_Node_State.IE_FILTER_NOW;\r
} else {\r
+ elm.style.removeAttribute( 'filter' );\r
that._flags &= ~X_Node_State.IE_FILTER_NOW;\r
};\r
};\r
};\r
\r
if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
- that._rawObject.style.filter = v = X_Node_CSS_objToIEFilterText( that );\r
+ v = X_Node_CSS_objToIEFilterText( that );\r
if( v ){\r
+ elm.style.filter = v;\r
that._flags |= X_Node_State.IE_FILTER_NOW;\r
} else {\r
+ elm.style.removeAttribute( 'filter' );\r
that._flags &= ~X_Node_State.IE_FILTER_NOW;\r
};\r
};\r
*/\r
var X_Node__actualCreate =\r
X_UA_DOM.W3C ? (function( that, isChild ){\r
- var elm = that._rawObject, xnodes, frg, i, l;\r
- \r
- if( !that._tag ){\r
- if( elm ){\r
- that._flags & X_Node_BitMask_IS_DIRTY && ( elm.data = X_String_chrReferanceTo( that._text ) );\r
- that._flags &= X_Node_BitMask_RESET_DIRTY;\r
- return elm;\r
- };\r
- that._flags &= X_Node_BitMask_RESET_DIRTY;\r
- return that._rawObject = document.createTextNode( X_String_chrReferanceTo( that._text ) );\r
- };\r
- \r
- if( !elm ){\r
- that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true );\r
\r
- that._rawObject = elm =\r
- X_Node_strictElmCreation ?\r
- document.createElement( [\r
- '<', that._tag,\r
- ' UID="', that._uid, '"',\r
- that._id ? ' id="' + that._id + '"' : '',\r
- that._className ? ' class="' + that._className + '"' : '',\r
- that._flags & X_Node_State.OLD_ATTRTEXT ? X_Node_Attr_objToAttrText( that ) : that._attrText,\r
- that._cssText ? ' style="' + that._cssText + '"' : '',\r
- '>' ].join( '' ) ) :\r
- document.createElement( that._tag );\r
- \r
- that._flags |= X_Node_State.ELM_NEED_INIT; \r
- };\r
- \r
- if( X_Node_documentFragment ){\r
- if( ( xnodes = that._xnodes ) && ( l = xnodes.length ) ){\r
- !isChild && ( frg = X_Node_documentFragment ).appendChild( elm );\r
- for( i = 0; i < l; ++i ){\r
- elm.appendChild( X_Node__actualCreate( xnodes[ i ], true ) );\r
- };\r
- return frg || elm;\r
- };\r
- };\r
- \r
- return elm;\r
}) :\r
X_UA_DOM.IE4 ? (function( that, isChild ){\r
var uid = that._uid,\r
html = [ '<FONT id=ie4uid', uid, ' UID="', uid, '">', that._text, '</FONT>' ];// fake textNode\r
delete that._rawObject;\r
} else {\r
- if( /* that._rawObject && */ !isChild ) X_Node__actualRemove( that, /* true */ false );\r
+ if( !isChild ) X_Node__actualRemove( that, /* true */ false );\r
\r
that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true );\r
\r
\r
var X_Node__afterActualCreate =\r
X_UA_DOM.W3C ? (function( that ){\r
- var elm = that._rawObject, xnodes, l, i, v;\r
- \r
- if( !that._tag ){\r
- elm.UID = that._uid;\r
- return elm;\r
- };\r
- \r
- xnodes = that._xnodes;\r
- l = xnodes && xnodes.length;\r
-\r
- that._flags &= ~X_Node_State.DIRTY_POSITION;\r
-\r
- // ie5 では、documentFragment が無いため、この位置で要素はこれのみ。\r
- if( X_Node_displayNoneFixForIE5 ){\r
- that._flags & X_Node_State.ELM_NEED_INIT || ( that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm ) );\r
- \r
- if( elm.currentStyle.display === 'none' ){\r
- X_Node__actualRemove( that );\r
- that._flags |= X_Node_State.IE5_DISPLAY_NONE_FIX;\r
- return;\r
- } else {\r
- that._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX;\r
- };\r
- };\r
-\r
- // src の onload があるので先ではないか?\r
- // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
- X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
\r
- if( that._flags & X_Node_State.ELM_NEED_INIT ){\r
- that._flags ^= X_Node_State.ELM_NEED_INIT;\r
- \r
- if( !X_Node_documentFragment ){// docFrg が使えない場合、doc 追加後に子を追加 TODO ie の場合この順序(メモリリーク対策)、他のブラウザは 子が先が有利では?\r
- for( i = 0; i < l; ++i ){\r
- elm.appendChild( X_Node__actualCreate( xnodes[ i ], true ) );\r
- };\r
- }; \r
- \r
- if( X_Node_strictElmCreation ){\r
- // TODO src 等の設定\r
- if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
- // doc 追加後に filter を指定しないと有効にならない。\r
- elm.style.filter = v = X_Node_CSS_objToIEFilterText( that );\r
- if( v ){\r
- that._flags |= X_Node_State.IE_FILTER_NOW;\r
- } else {\r
- that._flags &= ~X_Node_State.IE_FILTER_NOW;\r
- };\r
- };\r
- delete that._newAttrs;\r
- that._flags &= X_Node_BitMask_RESET_DIRTY;\r
- } else {\r
- console.log();\r
- elm.UID = that._uid;\r
- that._newAttrs = that._attrs;\r
- that._flags |= X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME | X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_CSS | X_Node_State.DIRTY_IE_FILTER;\r
- X_Node__updateRawNode( that, elm );\r
- \r
- // http://outcloud.blogspot.jp/2010/09/iframe.html\r
- // この問題は firefox3.6 で確認\r
- if( X_UA.Gecko && that._tag === 'IFRAME' ){\r
- if( !that._attrs[ 'src' ] ){\r
- elm.contentWindow.location.replace = elm.src = 'about:blank'; \r
- };\r
- };\r
- };\r
- } else {\r
- that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
- };\r
-\r
- for( i = 0; i < l; ++i ){\r
- X_Node__afterActualCreate( xnodes[ i ] );\r
- };\r
-\r
- return elm;\r
}) :\r
X_UA_DOM.IE4 ? (function( that ){\r
var xnodes, i, v;\r
X_Node__afterActualCreate( xnodes[ --i ] );\r
};\r
};\r
- if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
- X_Node__ie4getRawNode( that ).style.filter = v = X_Node_CSS_objToIEFilterText( that );\r
- if( v ){\r
- that._flags |= X_Node_State.IE_FILTER_NOW;\r
- } else {\r
- that._flags &= ~X_Node_State.IE_FILTER_NOW;\r
- };\r
- };\r
+ that._flags & X_Node_State.DIRTY_IE_FILTER && X_Node__updateRawNode( that, that._rawObject || X_Node__ie4getRawNode( that ) );\r
that._flags &= X_Node_BitMask_RESET_DIRTY;\r
X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
}) :\r