OSDN Git Service

Version 0.6.128, creanup commitUpdate().
authoritozyun <itozyun@user.sourceforge.jp>
Fri, 30 Jan 2015 08:37:05 +0000 (17:37 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Fri, 30 Jan 2015 08:37:05 +0000 (17:37 +0900)
0.6.x/js/02_dom/02_XNode.js
0.6.x/js/02_dom/05_XNodeAttr.js
0.6.x/js/05_util/01_XNinjaIframe.js

index e4c32c6..9c6d66d 100644 (file)
@@ -85,7 +85,7 @@ var
        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
@@ -1079,7 +1079,7 @@ var X_Node__commitUpdate =
        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
@@ -1119,24 +1119,84 @@ var X_Node__commitUpdate =
                        // 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
@@ -1165,6 +1225,14 @@ var X_Node__commitUpdate =
                                };\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
@@ -1272,30 +1340,42 @@ var X_Node__updateRawNode =
                                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
@@ -1315,10 +1395,12 @@ var X_Node__updateRawNode =
                                };\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
@@ -1359,10 +1441,12 @@ var X_Node__updateRawNode =
                        };\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
@@ -1402,47 +1486,7 @@ var X_Node__updateRawNode =
  */\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
@@ -1452,7 +1496,7 @@ var X_Node__actualCreate =
                        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
@@ -1501,81 +1545,7 @@ var X_Node__actualCreate =
 \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
@@ -1587,14 +1557,7 @@ var X_Node__afterActualCreate =
                                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
index 20e915b..cd9a1ff 100644 (file)
@@ -180,6 +180,15 @@ Node.prototype.attr = function( nameOrObj /* v */ ){
                        case 'cssText' :\r
                                return this.cssText();\r
 \r
+                       case 'src' : // src は遷移して変化する, name も?\r
+                               if( this._tag !== 'IFRAME' ) break;\r
+                               if( this._newAttrs && X_Object_inObject( nameOrObj, this._newAttrs ) ) return this._newAttrs[ nameOrObj ];\r
+                               if( elm = X_UA_DOM.IE4 ? this._rawObject || X_Node__ie4getRawNode( this ) : this._rawObject ){\r
+                                       if( !attrs ) attrs = this._attrs = {};\r
+                                       return attrs[ nameOrObj ] = elm[ nameOrObj ]; // getAttribute( nameOrObj )?\r
+                               };\r
+                               break;\r
+                               \r
                        case 'selected' :\r
                                // kquery.js : safariのバグ対策\r
                                // if ($.browser.safari && key === "selected" && tmp) tmp.selectedIndex;\r
index 6be609a..0973350 100644 (file)
@@ -58,7 +58,7 @@ X.Util.NinjaIframe = X.EventDispatcher.inherits(
                                        this._iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ this._name ];\r
                                        // http://d.hatena.ne.jp/NeoCat/20080921/1221940658\r
                                        // こちらに名前をsetしないとtargetが動作しない\r
-                                       this._iwin.name = this._name;\r
+                                       if( X_UA.IE ) this._iwin.name = this._name;\r
                                        \r
                                        this.xnodeIframe.listen( [ X_UA.IE < 9 ? 'readystatechange' : 'load', 'error' ], this );\r
                                        \r