OSDN Git Service

Version 0.6.129, fix X.Node.
authoritozyun <itozyun@user.sourceforge.jp>
Sat, 31 Jan 2015 10:46:48 +0000 (19:46 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Sat, 31 Jan 2015 10:46:48 +0000 (19:46 +0900)
0.6.x/js/02_dom/02_XNode.js
0.6.x/js/02_dom/04_XBoxModel.js
0.6.x/js/02_dom/10_XNodeAnime.js

index 9c6d66d..da8f553 100644 (file)
@@ -1109,12 +1109,14 @@ var X_Node__commitUpdate =
                                if( X_Node_displayNoneFixForIE5 ){\r
                                        // filter の効いている要素を含む要素は display:none が無視される。\r
                                        // filter = '' で削除はできるが、再表示時に filter が消える。 -> filter な要素を削除してしまう。                                         \r
-                                       elm && elm.parentNode && X_Node__actualRemove( that );\r
+                                       if( elm && elm.parentNode ){\r
+                                               X_Node__actualRemove( that );\r
+                                       };\r
                                        return nextElement;\r
                                };\r
                                elm && ( elm.style.display = 'none' );\r
                                return elm || nextElement;\r
-                       };                              \r
+                       };                      \r
                        \r
                        // 5. ie5 非表示fixフラグ\r
                        accumulatedFlags |= that._flags;\r
@@ -1123,7 +1125,6 @@ var X_Node__commitUpdate =
                                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
@@ -1208,8 +1209,9 @@ var X_Node__commitUpdate =
                        // 9. ie5 only\r
                        // 親及び自身へのクラス・id指定で display : none になるケースがありそれを検出\r
                        // 生成と破棄が繰り返されてしまう、親と自身の id, class が変わった場合だけ再生成。 accumulatedFlags & ( ID | CLASSNAME )\r
+                       // currentStyle を観ていたときはエラーで停止する、alert と挟むと正常に動いて支離滅裂\r
                        if( X_Node_displayNoneFixForIE5 && that._tag ){\r
-                               if( elm.currentStyle.display === 'none' ){\r
+                               if( elm.runtimeStyle.display === 'none' ){\r
                                        X_Node__actualRemove( that );\r
                                        that._flags |= X_Node_State.IE5_DISPLAY_NONE_FIX;\r
                                        return nextElement;                                     \r
@@ -1245,6 +1247,18 @@ var X_Node__commitUpdate =
                                return elm;\r
                        };\r
                        \r
+                       // 4. style="display:none" の場合\r
+                       if( that._flags & X_Node_State.STYLE_IS_DISPLAY_NONE ){\r
+                               if( elm ){\r
+                                       elm.style.display = 'none';\r
+                                       if( elm.style.display !== 'none' ){ // ie4 の style は currentStyle 相当らしい、、、? div 以外への display:none が効かないので remove する。\r
+                                               X_Node__actualRemove( that );\r
+                                               return prevElement;\r
+                                       };\r
+                               };\r
+                               return elm || prevElement;\r
+                       };\r
+                       \r
                        if( !elm ){\r
                                prevElement ?\r
                                        prevElement.insertAdjacentHTML( 'AfterEnd', X_Node__actualCreate( that, false ) ) :\r
@@ -1370,6 +1384,7 @@ var X_Node__updateRawNode =
                                                case 'IFRAMEname' :\r
                                                        // http://d.hatena.ne.jp/NeoCat/20080921/1221940658\r
                                                        // こちらに名前をsetしないとtargetが動作しない\r
+                                                       // これってあとから name を変更できないバグでは? itozyun\r
                                                        // if( X_UA.IE ) elm.name = elm.contentWindow.name = v || '';\r
                                        };\r
                                        \r
@@ -1438,8 +1453,7 @@ var X_Node__updateRawNode =
                                        elm.removeAttribute( 'style' );\r
                                        delete that._cssText;\r
                                };\r
-                       };\r
-                       \r
+                       } else\r
                        if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
                                v = X_Node_CSS_objToIEFilterText( that );\r
                                if( v ){\r
@@ -1485,10 +1499,7 @@ var X_Node__updateRawNode =
  * document.createElement of ie4 is only for OPTION & IMAGE.\r
  */\r
 var X_Node__actualCreate =\r
-       X_UA_DOM.W3C ? (function( that, isChild ){\r
-\r
-       }) :\r
-       X_UA_DOM.IE4 ? (function( that, isChild ){\r
+       X_UA_DOM.IE4 && (function( that, isChild ){\r
                var uid = that._uid,\r
                        html, xnodes, n, i, l;\r
                \r
@@ -1540,14 +1551,10 @@ var X_Node__actualCreate =
                };\r
                \r
                return html.join( '' );\r
-       }) :\r
-       (function(){});\r
+       });\r
 \r
 var X_Node__afterActualCreate =\r
-       X_UA_DOM.W3C ? (function( that ){\r
-\r
-       }) :\r
-       X_UA_DOM.IE4 ? (function( that ){\r
+       X_UA_DOM.IE4 && (function( that ){\r
                var xnodes, i, v;\r
                \r
                if( !that._tag ) return that;\r
@@ -1560,8 +1567,7 @@ var X_Node__afterActualCreate =
                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
-       (function(){});\r
+       });\r
 \r
 var X_Node__actualRemove =\r
        X_UA_DOM.W3C ?\r
@@ -1571,6 +1577,7 @@ var X_Node__actualRemove =
                        var xnodes = that._xnodes,\r
                                elm    = that._rawObject,\r
                                child, i, l;\r
+\r
                        if( xnodes && ( l = xnodes.length ) ){\r
                                for( i = 0; i < l; ++i ){\r
                                        child = xnodes[ i ];\r
@@ -1586,8 +1593,14 @@ var X_Node__actualRemove =
                        // ちなみに elm.filters に触ると ie8 でなぜかカラム落ちが発生、、、\r
                        if( X_Node_displayNoneFixForIE5 ){\r
                                if( elm.filters && elm.filters.length ){\r
+                                       //elm.style.removeAttribute( 'filter' );\r
                                        isChild = false;\r
                                        delete that._rawObject;\r
+                                       // 破棄前に value を控える TODO checked, selected も!\r
+                                       if( X_Node_Attr_HAS_VALUE[ that._tag ] && ( !that._newAttrs || !X_Object_inObject( 'value', that._newAttrs ) ) ){\r
+                                               that._attrs.value = elm.value;\r
+                                       };\r
+                                       elm.innerHTML = '';\r
                                };\r
                        };\r
                        \r
index d89ca64..4ba6478 100644 (file)
@@ -69,8 +69,8 @@ Node.prototype.width = function(){
        X_Node_updateTimerID && X_Node_startUpdate();\r
        \r
        if( X_UA_DOM.W3C ){\r
-               // this.css( X_Node_CSS_Unit.px, 'width' );\r
-               return this._rawObject.offsetWidth;\r
+               // TODO width : length + overflow : hidden ならそれを返す? <- block or inline\r
+               return this._rawObject ? this._rawObject.offsetWidth : 0;\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
                return ( this._rawObject || X_Node__ie4getRawNode( this ) ).offsetWidth;\r
@@ -86,7 +86,7 @@ Node.prototype.height = function(){
        \r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'height' );\r
-               return this._rawObject.offsetHeight;\r
+               return this._rawObject ? this._rawObject.offsetHeight : 0;\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
                return ( this._rawObject || X_Node__ie4getRawNode( this ) ).offsetHeight;\r
@@ -102,7 +102,7 @@ Node.prototype.clientWidth = function(){
        \r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'width' );\r
-               return this._rawObject.clientWidth;\r
+               return this._rawObject ? this._rawObject.clientWidth : 0;\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
                return ( this._rawObject || X_Node__ie4getRawNode( this ) ).clientWidth;\r
@@ -118,7 +118,7 @@ Node.prototype.clientHeight = function(){
 \r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'height' );\r
-               return this._rawObject.clientHeight;\r
+               return this._rawObject ? this._rawObject.clientHeight : 0;\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
                return ( this._rawObject || X_Node__ie4getRawNode( this ) ).clientHeight;\r
@@ -134,7 +134,7 @@ Node.prototype.scrollWidth = function(){
 \r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'width' );\r
-               return this._rawObject.scrollWidth;\r
+               return this._rawObject ? this._rawObject.scrollWidth : 0;\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
                return ( this._rawObject || X_Node__ie4getRawNode( this ) ).scrollWidth;\r
@@ -149,7 +149,7 @@ Node.prototype.scrollHeight = function(){
        X_Node_updateTimerID && X_Node_startUpdate();\r
 \r
        if( X_UA_DOM.W3C ){\r
-               return this._rawObject.scrollHeight;\r
+               return this._rawObject ? this._rawObject.scrollHeight : 0;\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
                return ( this._rawObject || X_Node__ie4getRawNode( this ) ).scrollHeight;\r
@@ -165,7 +165,7 @@ Node.prototype.scrollLeft = function(){
 \r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'width' );\r
-               return this._rawObject.scrollLeft;\r
+               return this._rawObject ? this._rawObject.scrollLeft : 0;\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
                return ( this._rawObject || X_Node__ie4getRawNode( this ) ).scrollLeft;\r
@@ -181,7 +181,7 @@ Node.prototype.scrollTop = function(){
        \r
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'width' );\r
-               return this._rawObject.scrollTop;\r
+               return this._rawObject ? this._rawObject.scrollTop : 0;\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
                return ( this._rawObject || X_Node__ie4getRawNode( this ) ).scrollTop;\r
@@ -206,7 +206,7 @@ Node.prototype.x = function(){
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'left' );\r
                // this.css( X_Node_CSS_Unit.px, 'translateX' );\r
-               return this._rawObject.offsetLeft;\r
+               return this._rawObject ? this._rawObject.offsetLeft : 0;\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
                // pixelLeft http://www.din.or.jp/~hagi3/JavaScript/JSTips/DHTML/ProbIE5.htm\r
@@ -224,7 +224,7 @@ Node.prototype.y = function(){
        if( X_UA_DOM.W3C ){\r
                // this.css( X_Node_CSS_Unit.px, 'top' );\r
                // this.css( X_Node_CSS_Unit.px, 'transisitonY' );\r
-               return this._rawObject.offsetTop;\r
+               return this._rawObject ? this._rawObject.offsetTop : 0;\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
                return ( this._rawObject || X_Node__ie4getRawNode( this ) ).offsetTop;          \r
@@ -244,7 +244,7 @@ Node.prototype.offset = function( /* xnodeParent */ ){
        X_Node_updateTimerID && X_Node_startUpdate();\r
        \r
        if( X_UA_DOM.W3C ){\r
-               return X_Node_getPosition( this._rawObject );\r
+               return this._rawObject ? X_Node_getPosition( this._rawObject ) : { x : 0, y : 0 };\r
        } else\r
        if( X_UA_DOM.IE4 ){\r
                return X_Node_getPosition( this._rawObject || X_Node__ie4getRawNode( this ) );\r
index 463080a..9a3078c 100644 (file)
@@ -281,7 +281,7 @@ function X_Node_Anime_updateAnimation( xnode ){
                        X_ViewPort.unlisten( X.Event.AFTER_UPDATE, xnode, X_Node_Anime_gpuReleased );\r
                        \r
                        xnode.css({\r
-                               //willChange               : X_Node_Anime_transitionProps + ',opacity,width,height',\r
+                               willChange               : X_Node_Anime_transitionProps + ',opacity,width,height',\r
                                backfaceVisibility       : 'hidden',\r
                                transitionTimingFunction : obj.easing.style,\r
                                transitionDelay          : '0s' // 0.001 にすると transitionend のタイミングが狂う、、、\r
@@ -300,7 +300,7 @@ function X_Node_Anime_updateAnimation( xnode ){
                                xnode.listenOnce( 'transitionend', X_Node_Anime_onTransitionEnd );\r
                        \r
                                xnode.css({\r
-                                       transitionProperty : X_Node_Anime_transitionProps + ',opacity,width,height', // X_Node_Anime_readyTransitionに移動??\r
+                                       transitionProperty : X_Node_Anime_transitionProps + ',opacity,width,height',\r
                                        transitionDuration : obj.duration + 'ms'\r
                                });\r
                                \r
@@ -445,10 +445,10 @@ function X_Node_Anime_clearTransition( xnode ){
        // 開始座標のセット(新規のみ)\r
        // アニメーション指定のセット(または解除)(対象のみ)\r
        // 目標座標のセット\r
-       //xnode.unlisten( 'transitionend', X_Node_Anime_onTransitionEnd );\r
+       xnode.unlisten( 'transitionend', X_Node_Anime_onTransitionEnd );\r
 \r
        xnode.css({\r
-               //willChange               : '',\r
+               willChange               : '',\r
                backfaceVisibility       : '',\r
                transitionTimingFunction : '',\r
                transitionDelay          : '',\r