OSDN Git Service

Version 0.6.131, cleanup X.EventDispatcher.
authoritozyun <itozyun@user.sourceforge.jp>
Thu, 19 Feb 2015 05:06:43 +0000 (14:06 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Thu, 19 Feb 2015 05:06:43 +0000 (14:06 +0900)
0.6.x/js/01_core/11_XClass.js
0.6.x/js/01_core/13_XEventDispatcher.js
0.6.x/js/01_core/14_XTimer.js
0.6.x/js/02_dom/02_XNode.js
0.6.x/js/02_dom/05_XNodeAttr.js
0.6.x/js/02_dom/06_XNodeCSS.js
0.6.x/js/02_dom/10_XNodeAnime.js
0.6.x/js/06_net/01_XNetXHR.js
0.6.x/js/07_audio/03_XSilverlightAudio.js

index 1280d1a..248b5bd 100644 (file)
@@ -54,11 +54,10 @@ X_Class_CommonProps =
                // X.Event.KILL_INSTANCE_CANCELED は kill() がキャンセルされた場合に発行。また dispatchループ中にkill()が呼ばれると一旦キャンセルされ発行。\r
                //   (flagを立ててdispatchの終わりにkillする)\r
                if( this.instanceOf( X.EventDispatcher ) ){\r
-                       //console.log( 'this.instanceOf( X.EventDispatcher )! ' + this._dispatching );\r
                        if( !def.isPrivate ){\r
-                               if( this._dispatching ){\r
+                               if( this[ '_listeners' ] && this[ '_listeners' ]._dispatching ){\r
                                        this.dispatch( X.Event.BEFORE_KILL_INSTANCE );\r
-                                       this._killReserved = true;\r
+                                       this[ '_listeners' ]._killReserved = true;\r
                                        this.dispatch( X.Event.KILL_INSTANCE_CANCELED );\r
                                        return;\r
                                } else\r
@@ -86,8 +85,8 @@ X_Class_CommonProps =
                        if( i !== -1 ){\r
                                data = X_Class_getPrivate( instance );\r
                                X_Class_killPrivateFlag = true;\r
-                               if( data._dispatching && data.instanceOf( X.EventDispatcher ) ){\r
-                                       data._killReserved = true;\r
+                               if( data[ '_listeners' ] && data[ '_listeners' ]._dispatching && data.instanceOf( X.EventDispatcher ) ){\r
+                                       data[ '_listeners' ]._killReserved = true;\r
                                } else {\r
                                        data.kill();\r
                                };\r
index 25c2d11..36a11fb 100644 (file)
@@ -29,7 +29,33 @@ var X_EventDispatcher_once       = false,
        X_EventDispatcher_unlock     = false,\r
        X_EventDispatcher_needsIndex = false,\r
        \r
-       X_EventDispatcher_safariPreventDefault = false; // Safari3-\r
+       X_EventDispatcher_safariPreventDefault = false, // Safari3-\r
+       \r
+       X_EventDispatcher_EVENT_TARGET_TYPE = {\r
+               OTHER        : 0,\r
+               XHR          : 1,\r
+               SILVER_LIGHT : 2\r
+       },\r
+       \r
+       X_EventDispatcher_LAZY_TIMERS = {}; // Object.<number, X.EventDispatcher> number は timerID\r
+       \r
+/*\r
+ * イベントリスナをイベント名(string)や数値(1~,フレームワーク内で定義)をキーとするArrayで記憶します。\r
+ * Arrayには、{k:種類,x:コンテキスト(thisObject),f:関数,s:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
+ * また、dispatch 中の状態と操作を記録し不整合が起きないようにするためのプロパティを持ちます。\r
+ * @typedef {(\r
+ *     {\r
+ *      _handleEvent  : function,\r
+ *      _dispatching  : number,\r
+ *      _reserves     : (Array|undefined),\r
+ *      _unlistens    : {Object.<(number|string), Array.<(X.Callback|function)>>},\r
+ *      _killReserved : (Boolean|undefiend)\r
+ *  }\r
+ *   |\r
+ *  Object.<(number|string), Array.<(callbackHash|function)>>\r
+ * )}\r
+ */\r
+var X_EventDispatcher_listeners;\r
 \r
 // ------------------------------------------------------------------------- //\r
 // --- interface ----------------------------------------------------------- //\r
@@ -61,14 +87,19 @@ X.EventDispatcher =
            /** @lends X.EventDispatcher.prototype */\r
                {\r
 \r
-\r
-\r
-               // TODO _rawObjectType EventTarget, XHR, Silverlight, ...\r
+               /**\r
+                * OTHER(Node,window,document,Image,Audio), XHR, Silverlight\r
+                * @private\r
+                * @type {number}\r
+                */\r
+                       '_rawType'      : X_EventDispatcher_EVENT_TARGET_TYPE.OTHER,\r
+               \r
                /**\r
                 * イベントリスナをイベント名(string)や数値(1~,フレームワーク内で定義)をキーとするArrayで記憶します。\r
                 * Arrayには、{k:種類,x:コンテキスト(thisObject),f:関数,s:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
+                * \r
                 * @private\r
-                * @type {Object.<(number|string), Array.<(callbackHash|function)>>}\r
+                * @type {X_EventDispatcher_listeners}\r
                 */\r
                        '_listeners'    : null,\r
 \r
@@ -76,62 +107,15 @@ X.EventDispatcher =
                 * _rawObject には HTMLElement, window, document, XHR といったイベントターゲットオブジェクトを設定します。\r
                 * _rawObject が設定されていると listen(), unlisten() 時に addEventListener(DOM Level2) や detachEvent(ie5~8), on~(DOM0) 等を操作します。\r
                 * _rawObject は最初の listen() 前に設定しておかないと addEventListener 等が意図したように行われません。\r
-                * X.Node ã\81§ã\81¯é\9d\9eå\90\8cæ\9c\9fã\81« HTMLElement ã\82\92ç\94\9fæ\88\90ã\81\97ã\81¦ã\81\84ã\81¦、要素生成以前に listen, unlisten を呼び出すことができます。これは適宜に X_EventDispatcher_toggleAllEvents を呼んで解決しているためです。\r
+                * X.Node ã\81§ã\81¯é\9d\9eå\90\8cæ\9c\9fã\81« HTMLElement ã\82\92ç\94\9fæ\88\90ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\81\8c、要素生成以前に listen, unlisten を呼び出すことができます。これは適宜に X_EventDispatcher_toggleAllEvents を呼んで解決しているためです。\r
                 * @private\r
                 * @type {Object}\r
                 */\r
                        '_rawObject'    : null,\r
-               \r
-               /**\r
-                * _rawObject がある場合、イベントターゲットオブジェクトに対して addEventListener, attachEvent, onXX 時に実際に渡される関数。\r
-                * イベントタイプが変わっても、単一の オブジェクトを使いまわす。(但し例外は、IE8以下の XHR|MSXML に対して。)最初の listen で生成されて、最後の unlisten で削除される。\r
-                * @private\r
-                * @type {X.Callback}\r
-                */\r
-                       '_handleEvent'  : null,\r
-                       \r
-               /**\r
-                * dispatch 中に dispatch が呼ばれた際に、そのネストの深さを保存する。\r
-                * dispatch() 終了時に _dispatching が 0 の場合に、現在のインスタンスの dispatch がすべて終わったことになる。\r
-                * @private\r
-                * @type {number}\r
-                */\r
-                       '_dispatching'  : 0,     // dispatch 中の unlisten で使用\r
-\r
-               /**\r
-                * dispatch 中に listen が呼ばれた場合に、配列のindexがずれることを避けるため、一旦保持する。\r
-                * _dispatching が 0 のときに _reserves を使って listen() を呼び出す。\r
-                * @private\r
-                * @type {Object.<(number|string), Array.<(X.Callback|function)>>}\r
-                */\r
-                       '_reserves'     : null,\r
-               \r
-               /**\r
-                * dispatch 中に unlisten が呼ばれた場合に、配列のindexがずれることを避けるため、一旦保持する。\r
-                * _dispatching が 0 のときに _unlistens を使って unlisten() を呼び出す。\r
-                * @private\r
-                * @type {Object.<(number|string), Array.<(X.Callback|function)>>}\r
-                */\r
-                       '_unlistens'    : null,\r
-                       \r
-               /**\r
-                * dispatch 中に kill が呼ばれた場合に、X.EventDispatcher インスタンスの削除を dispatch 後にずらすために立てるフラグ。\r
-                * @private\r
-                * @type {boolean}\r
-                */\r
-                       '_killReserved' : false,\r
-\r
-               /**\r
-                * asyncDispatch 中に kill が呼ばれた場合に、X.EventDispatcher インスタンスの削除を最後のタイマーの発火後にずらすために立てるフラグ。\r
-                * TODO asyncDispatch の解除はどうする?\r
-                * @private\r
-                * @type {boolean}\r
-                */\r
-                       '_lastLazyID' : false,\r
                        \r
            /**\r
             * X.EventDispatcher のコンストラクタの実体。\r
-            * @@@constructs\r
+            * @constructs\r
             * @this {X.EventDispatcher}\r
             * @param {object=} opt_rawObject\r
             */\r
@@ -196,30 +180,31 @@ X.EventDispatcher =
                 * @param {Array=} opt_arg3\r
                 */                     \r
                        listening : function( opt_type, opt_arg1, opt_arg2, opt_arg3 ){\r
-                               var list = this._listeners,\r
-                                       unlistens, i, f, hash;\r
+                               var listeners = this[ '_listeners' ],\r
+                                       lock      = X_EventDispatcher_lock || X_EventDispatcher_unlock,\r
+                                       list, cbHash, unlistens, i, f;\r
                                \r
-                               if( opt_type === undefined ) return !!list;\r
-                               if( !list || !( list = list[ opt_type ] ) ) return false;\r
+                               if( opt_type === undefined ) return !!listeners;\r
+                               if( !listeners || !( list = listeners[ opt_type ] ) ) return false;\r
                                if( opt_arg1 === undefined ) return true;\r
                                \r
                                if( opt_arg1.k ){\r
-                                       hash = opt_arg1;\r
+                                       cbHash = opt_arg1;\r
                                } else {\r
-                                       hash = X_Callback_classifyCallbackArgs( opt_arg1, opt_arg2, opt_arg3, this );\r
+                                       cbHash = X_Callback_classifyCallbackArgs( opt_arg1, opt_arg2, opt_arg3, this );\r
                                };\r
                                \r
-                               if( ( unlistens = this._unlistens ) && ( unlistens = unlistens[ opt_type ] ) ){\r
+                               if( ( unlistens = listeners._unlistens ) && ( unlistens = unlistens[ opt_type ] ) ){\r
                                        for( i = unlistens.length; i; ){\r
                                                f = unlistens[ --i ];\r
-                                               if( f === hash || ( f.x === hash.x && f.f === hash.f && f.s === hash.s ) ) return false;\r
+                                               if( f === cbHash || ( f.x === cbHash.x && f.f === cbHash.f && f.s === cbHash.s && f.lock === lock ) ) return false;\r
                                        };\r
                                };\r
                                for( i = list.length; i; ){\r
                                        f = list[ --i ];\r
-                                       if( f === hash || ( f.x === hash.x && f.f === hash.f && f.s === hash.s ) ){\r
+                                       if( f === cbHash || ( f.x === cbHash.x && f.f === cbHash.f && f.s === cbHash.s && f.lock === lock ) ){\r
                                                // index を要求された場合、lock されていない、または unlock なら index を返す\r
-                                               return X_EventDispatcher_needsIndex ? ( X_EventDispatcher_unlock || !f.lock ? i : false ) : true;\r
+                                               return X_EventDispatcher_needsIndex ? i : true;\r
                                        };\r
                                };\r
                                return false;\r
@@ -233,11 +218,14 @@ X.EventDispatcher =
                 * @return {number} X.Timer.add() の戻り値\r
                 */                     \r
                        asyncDispatch : function( delay, e ){\r
+                               var timerID;\r
                                if( delay && e === undefined ){\r
                                        e = delay;\r
                                        delay = 0;\r
                                };\r
-                               return this[ '_lastLazyID' ] = X.Timer.add( delay, 1, this, X_EventDispatcher_dispatch, [ e ] );\r
+                               timerID = X.Timer.add( delay, 1, this, X_EventDispatcher_dispatch, [ e ] );\r
+                               X_EventDispatcher_LAZY_TIMERS[ timerID ] = this;\r
+                               return timerID;\r
                        }\r
                }\r
        );\r
@@ -253,12 +241,12 @@ X.EventDispatcher =
  * @param {(eventHash|string|number)} e\r
  */\r
 function X_EventDispatcher_dispatch( e ){\r
-       var list  = this[ '_listeners' ],\r
-               ret   = X_Callback_NONE,\r
-               type  = e[ 'type' ],\r
-               unlistens, i, l, args, f, r, sysOnly;\r
+       var listeners = this[ '_listeners' ],\r
+               ret       = X_Callback_NONE,\r
+               type      = e[ 'type' ],\r
+               list, unlistens, i, l, args, f, r, sysOnly, timerID;\r
        \r
-       if( !list || !( list = list[ type || e ] ) ) return ret;\r
+       if( !listeners || !( list = listeners[ type || e ] ) ) return ret;\r
        \r
        // 数値, 文字が渡された場合\r
        if( !type ){\r
@@ -267,17 +255,21 @@ function X_EventDispatcher_dispatch( e ){
        e.target        = e.target || this;\r
        e.currentTarget = e.currentTarget || this;\r
        \r
-       ++this._dispatching;\r
+       if( listeners._dispatching ){\r
+               ++listeners._dispatching;\r
+       } else {\r
+               listeners._dispatching = 1;\r
+       };\r
        \r
        // todo:\r
        // type も保存\r
-       this._unlistens = this._unlistens || {};\r
-       unlistens = this._unlistens[ type ];\r
+       listeners._unlistens = listeners._unlistens || {};\r
+       unlistens = listeners._unlistens[ type ];\r
        \r
        for( i = 0; i < list.length; ++i ){\r
                f = list[ i ];\r
                if( !unlistens ){\r
-                       unlistens = this._unlistens[ type ];\r
+                       unlistens = listeners._unlistens[ type ];\r
                };\r
                if( unlistens && unlistens.indexOf( f ) !== -1 ) continue;\r
                \r
@@ -292,7 +284,7 @@ function X_EventDispatcher_dispatch( e ){
                if( f.once || r & X_Callback_UN_LISTEN ){\r
                        // dispatch 中に unlisten が作られることがある\r
                        if( !unlistens ){\r
-                               unlistens = this._unlistens || ( this._unlistens = {} );\r
+                               unlistens = listeners._unlistens || ( listeners._unlistens = {} );\r
                                unlistens = unlistens[ type ] || ( unlistens[ type ] = [] );\r
                        };\r
                        unlistens.indexOf( f ) === -1 && ( unlistens[ unlistens.length ] = f );\r
@@ -304,33 +296,12 @@ function X_EventDispatcher_dispatch( e ){
                ret |= X.Type.isFinite( r ) ? r : 0;\r
        };\r
        \r
-       if( ( --this._dispatching ) === 0 ){\r
-               \r
-               if( this[ '_lastLazyID' ] && X_Timer_currentUID === this[ '_lastLazyID' ] ){\r
-                       delete this[ '_lastLazyID' ];\r
-               };\r
-               \r
-               // dispatch 中に unlisten された要素の削除\r
-               unlistens = this._unlistens;\r
-               delete this._dispatching;\r
-               delete this._unlistens;                                 \r
-               // _unlistens に入っている callbackHash は、lock をクリアしている\r
-               X_EventDispatcher_unlock = true;\r
-               for( type in unlistens ){\r
-                       //if( X_EMPTY_OBJECT[ type ] ) continue;\r
-                       list = unlistens[ type ];\r
-                       for( i = list.length; i; ){\r
-                               this.unlisten( type, list[ --i ] );\r
-                       };\r
-                       list.length = 0;\r
-                       delete unlistens[ type ];\r
-               };\r
-               X_EventDispatcher_unlock = false;\r
+       if( ( --listeners._dispatching ) === 0 ){\r
+\r
+               delete listeners._dispatching;\r
                \r
-               if( this._killReserved ){\r
-                       this.kill();\r
-               } else\r
-               if( list = this._reserves ){\r
+               // dispatch 中に listen されたイベントの追加\r
+               if( list = listeners._reserves ){\r
                        for( i = 0, l = list.length; i < l; ++i ){\r
                                f = list[ i ];\r
                                X_EventDispatcher_once = f[ 4 ];\r
@@ -341,7 +312,36 @@ function X_EventDispatcher_dispatch( e ){
                                f.length = 0;\r
                        };\r
                        list.length = 0;\r
-                       delete this._reserves;\r
+                       delete listeners._reserves;\r
+               };              \r
+               \r
+               // dispatch 中に unlisten されたイベントの削除\r
+               if( unlistens = listeners._unlistens ){\r
+                       delete listeners._unlistens;\r
+                       \r
+                       // _unlistens に入っている callbackHash は、lock をクリアしている\r
+                       X_EventDispatcher_unlock = true;\r
+                       for( type in unlistens ){\r
+                               //if( X_EMPTY_OBJECT[ type ] ) continue;\r
+                               list = unlistens[ type ];\r
+                               for( i = list.length; i; ){\r
+                                       this.unlisten( type, list[ --i ] );\r
+                               };\r
+                               list.length = 0;\r
+                               delete unlistens[ type ];\r
+                       };\r
+                       X_EventDispatcher_unlock = false;                       \r
+               };\r
+               \r
+               if( X_EventDispatcher_LAZY_TIMERS[ X_Timer_currentUID ] === this ){\r
+                       delete X_EventDispatcher_LAZY_TIMERS[ X_Timer_currentUID ];\r
+               };\r
+\r
+               if( listeners._killReserved ){\r
+                       for( timerID in X_EventDispatcher_LAZY_TIMERS ){\r
+                               if( X_EventDispatcher_LAZY_TIMERS[ timerID ] === this ) return ret;\r
+                       };                      \r
+                       this.kill();\r
                };\r
        };\r
        \r
@@ -359,14 +359,14 @@ function X_EventDispatcher_dispatch( e ){
  * @return {X.EventDispatcher}\r
  */\r
 function X_EventDispatcher_listen( type, opt_arg1, opt_arg2, opt_arg3 ){\r
-       var list = this._listeners,\r
-               i, raw, add, f;\r
+       var listeners = this[ '_listeners' ],\r
+               i, raw, add, list, f;\r
 \r
        if( !type ) return this;\r
        \r
-       if( this._dispatching ){\r
-               if( !this._reserves ) this._reserves = [];\r
-               this._reserves[ this._reserves.length ] = [ type, opt_arg1, opt_arg2, opt_arg3, X_EventDispatcher_once, X_EventDispatcher_lock ];\r
+       if( listeners && listeners._dispatching ){\r
+               if( !listeners._reserves ) listeners._reserves = [];\r
+               listeners._reserves[ listeners._reserves.length ] = [ type, opt_arg1, opt_arg2, opt_arg3, X_EventDispatcher_once, X_EventDispatcher_lock ];\r
                return this;\r
        };\r
        \r
@@ -378,12 +378,12 @@ function X_EventDispatcher_listen( type, opt_arg1, opt_arg2, opt_arg3 ){
        };\r
        \r
        raw = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
-       add = raw && ( !list || !list[ type ] ) && X.Type.isString( type );\r
-       \r
+       add = raw && ( !listeners || !listeners[ type ] ) && X.Type.isString( type );\r
+\r
        if( this.listening( type, opt_arg1 || this, opt_arg2, opt_arg3 ) ) return this;\r
 \r
-       if( !list ) list = this._listeners = {};\r
-       if( !( list = list[ type ] ) ) list = this._listeners[ type ] = [];\r
+       if( !listeners ) listeners = this[ '_listeners' ] = {};\r
+       list = listeners[ type ] || ( listeners[ type ] = [] );\r
        \r
        add && X_EventDispatcher_addEvent( this, type, raw, list );\r
        \r
@@ -416,9 +416,9 @@ function X_EventDispatcher_systemListen( that, type, opt_arg1, opt_arg2, opt_arg
  * @param {Array=} opt_arg3\r
  */\r
 function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){\r
-       var list = this._listeners,\r
-               _list, reserves, unlistens, i, f, raw, empty;\r
-       if( !list ) return this;\r
+       var listeners = this[ '_listeners' ],\r
+               list, reserves, unlistens, i, f, raw, k, empty;\r
+       if( !listeners ) return this;\r
        \r
        if( X.Type.isArray( opt_type ) ){\r
                for( i = opt_type.length; i; ){\r
@@ -432,11 +432,12 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){
        \r
        if( opt_type === undefined ){\r
                // 全て削除\r
-               for( opt_type in list ){\r
+               for( opt_type in listeners ){\r
                        //if( X_EMPTY_OBJECT[ opt_type ] ) continue;\r
-                       _list = list[ opt_type ];\r
-                       for( i = _list.length; i; ){\r
-                               this.unlisten( opt_type, _list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
+                       if( opt_type.charAt( 0 ) === '_' ) continue;\r
+                       list = listeners[ opt_type ];\r
+                       for( i = list.length; i; ){\r
+                               this.unlisten( opt_type, list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
                        };\r
                        // this.unlisten( opt_type ); これは無茶!\r
                };\r
@@ -444,19 +445,19 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){
        } else\r
        if( opt_arg1 === undefined ){\r
                // 同一タイプを全て削除\r
-               if( _list = list[ opt_type ] ){\r
-                       for( i = _list.length; i; ){\r
-                               this.unlisten( opt_type, _list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
+               if( list = listeners[ opt_type ] ){\r
+                       for( i = list.length; i; ){\r
+                               this.unlisten( opt_type, list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
                        };\r
                };\r
                return this;\r
        } else\r
-       if( reserves = this._reserves ){\r
+       if( reserves = listeners._reserves ){\r
                for( i = reserves.length; i; ){\r
                        f = reserves[ --i ];\r
-                       if( f[ 0 ] === opt_type && f[ 1 ] === opt_arg1 && f[ 2 ] === opt_arg2 && f[ 3 ] === opt_arg3 ){\r
+                       if( f[ 0 ] === opt_type && f[ 1 ] === opt_arg1 && f[ 2 ] === opt_arg2 && f[ 3 ] === opt_arg3 && ( !f[ 5 ] || X_EventDispatcher_unlock ) ){\r
                                reserves.splice( i, 1 );\r
-                               if( !reserves.legth ) delete this._reserves;\r
+                               if( !reserves.legth ) delete listeners._reserves;\r
                                return this;\r
                        };\r
                };\r
@@ -467,22 +468,31 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){
        X_EventDispatcher_needsIndex = false;\r
        if( i === false ) return this;\r
 \r
-       f = ( _list = list[ opt_type ] )[ i ];\r
-       // _unlistens に入っている callbackHash は、lock をクリアしている\r
-       if( unlistens = this._unlistens ){\r
+       f = ( list = listeners[ opt_type ] )[ i ];\r
+       \r
+       if( unlistens = listeners._unlistens ){\r
+               // _unlistens に入っている callbackHash は、lock のチェックは済んでいる\r
                ( unlistens = unlistens[ opt_type ] ) ?\r
                        ( unlistens[ unlistens.length ] = f ) :\r
-                       ( this._unlistens[ opt_type ] = [ f ] );\r
+                       ( listeners._unlistens[ opt_type ] = [ f ] );\r
        } else {\r
                delete f.once;\r
-               _list.splice( i, 1 );\r
-               if( !_list.length ){\r
+               list.splice( i, 1 );\r
+               if( !list.length ){\r
                        raw  = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
-                       delete list[ opt_type ];\r
-                       if( empty = X_Object_isEmpty( list ) ) delete this._listeners;\r
+                       delete listeners[ opt_type ];\r
+                       //empty = X_Object_isEmpty( listeners );\r
+                       // TODO カウンター\r
+                       empty = true;\r
+                       for( k in listeners ){\r
+                               if( k.charAt( 0 ) === '_' ) continue;\r
+                               empty = false;\r
+                               break;\r
+                       };\r
                        if( raw && '' + parseFloat( opt_type ) !== '' + opt_type ){ // 数字イベントの除外\r
-                               X_EventDispatcher_removeEvent( this, opt_type, raw, _list, !empty );\r
+                               X_EventDispatcher_removeEvent( this, opt_type, raw, list, !empty );\r
                        };\r
+                       if( empty ) delete this[ '_listeners' ];\r
                };\r
        };\r
        return this;\r
@@ -515,66 +525,84 @@ var X_EventDispatcher_actualAddEvent =
        // Days on the Moon DOM Events とブラウザの実装 \r
        // http://nanto.asablo.jp/blog/2007/03/23/1339502\r
        // Safari 2 では関数オブジェクトしか EventListener として使えませんが、Safari のナイトリービルドでは handleEvent メソッドを持つオブジェクトも EventListener として使えるようです。\r
-       X_UA_EVENT.W3C /* && ( X_UA.WebKit < 525.13 || X_UA.Opera7 || X_UA.NetFront < 4 ) */ ? // Safari3-\r
+       X_UA_EVENT.W3C ?\r
                (function( that, type, raw, list ){\r
-                       if( that._isXHR && X_UA.Opera < 12 ){\r
-                               // Opera11- の XHR は event オブジェクトが返らないため, eventType 毎に callback を指定する addEventListener もない\r
-                               raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
-                       } else\r
-                       if( that._isSilverlight ){\r
-                               list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
-                               list.sltoken    = raw.AddEventListener( type, list.slcallback );\r
-                       } else\r
-                       // iOS と MacOSX Iron36 で発生。連続してアニメーションが起こると、クロージャの束縛された obj へのアクセスに失敗する。Win では起きない?\r
-                       // むしろ、MacOSX のブラウザ全般で起こる??\r
-                       if( ( X_UA.WebKit || X_UA.Blink ) &&\r
-                               ( type === 'webkitTransitionEnd' || type === 'transitionend' ||\r
-                                 type === 'animationend'        || type === 'webkitAnimationEnd' ||\r
-                                 type === 'animationstart'      || type === 'webkitAnimationStart' ||\r
-                                 type === 'animationiteration'  || type === 'webkitAnimationIteration' ) ){\r
-                               raw.addEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
-                       } else {\r
-                               console.log( 'event > ' + type );\r
-                               that._handleEvent || ( that._handleEvent = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
+                       var f;\r
+                       switch( that[ '_rawType' ] ){\r
+                               case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+                                       list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
+                                       list.sltoken    = raw.AddEventListener( type, list.slcallback );\r
+                                       break;\r
+                               \r
+                               case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+                                       if( X_UA.Opera < 12 ){\r
+                                               // Opera11- の XHR は event オブジェクトが返らないため, eventType 毎に callback を指定する addEventListener もない\r
+                                               raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
+                                               break;\r
+                                       };\r
 \r
-                               if( raw.addEventListener ){\r
-                                       raw.addEventListener( type, that._handleEvent, false );\r
-                               } else {\r
-                                       // Safari は Image, Opera7 は window\r
-                                       raw[ 'on' + type ] = that._handleEvent;\r
-                               };\r
+                               default :\r
+                                       // iOS と MacOSX Iron36 で発生。連続してアニメーションが起こると、クロージャの束縛された obj へのアクセスに失敗する。Win では起きない?\r
+                                       // むしろ、MacOSX のブラウザ全般で起こる??\r
+                                       if( ( X_UA.WebKit || X_UA.Blink ) &&\r
+                                               ( type === 'webkitTransitionEnd' || type === 'transitionend' ||\r
+                                                 type === 'animationend'        || type === 'webkitAnimationEnd' ||\r
+                                                 type === 'animationstart'      || type === 'webkitAnimationStart' ||\r
+                                                 type === 'animationiteration'  || type === 'webkitAnimationIteration' ) ){\r
+                                               raw.addEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
+                                       } else {\r
+                                               f = that[ '_listeners' ]._handleEvent || ( that[ '_listeners' ]._handleEvent = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
+               \r
+                                               if( raw.addEventListener ){\r
+                                                       raw.addEventListener( type, f, false );\r
+                                               } else {\r
+                                                       // Safari は Image, Opera7 は window\r
+                                                       raw[ 'on' + type ] = f;\r
+                                               };\r
+                                       };\r
                        };\r
                }) :\r
        X_UA_EVENT.IE ?\r
                (function( that, type, raw, list ){\r
-                       if( that._isXHR ){\r
-                               // ie8- の XHR は window.event が更新されないため, eventType 毎に callback を指定する\r
-                               raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
-                       } else                                  \r
-                       if( that._isSilverlight ){\r
-                               list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
-                               list.sltoken    = raw.AddEventListener( type, list.slcallback );\r
-                       } else {                                \r
-                               that._handleEvent || ( that._handleEvent = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
+                       var f;\r
+                       switch( that[ '_rawType' ] ){   \r
+                               case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+                                       list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
+                                       list.sltoken    = raw.AddEventListener( type, list.slcallback );\r
+                                       break;                          \r
                                \r
-                               if( raw.attachEvent ){\r
-                                       raw.attachEvent( 'on' + type, that._handleEvent );\r
-                               } else {\r
-                                       raw[ 'on' + type ] = that._handleEvent;\r
-                               };\r
+                               case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+                                       // ie8- の XHR は window.event が更新されないため, eventType 毎に callback を指定する\r
+                                       raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
+                                       break;\r
+                               \r
+                               default :\r
+                                       f = that[ '_listeners' ]._handleEvent || ( that[ '_listeners' ]._handleEvent = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
+                                       \r
+                                       if( raw.attachEvent ){\r
+                                               raw.attachEvent( 'on' + type, f );\r
+                                       } else {\r
+                                               raw[ 'on' + type ] = f;\r
+                                       };\r
+                                       break;\r
                        };\r
                }) :\r
                (function( that, type, raw, list ){\r
-                       if( that._isXHR ){\r
-                               // ie4 mobile は XHR をサポート!\r
-                               raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
-                       } else\r
-                       if( that._isSilverlight ){\r
-                               // DOM0 で Silverlight ってあるの?\r
-                               list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
-                               list.sltoken    = raw.AddEventListener( type, list.slcallback );\r
-                       } else {\r
-                               raw[ 'on' + type ] = that._handleEvent || ( that._handleEvent = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
+                       switch( that[ '_rawType' ] ){\r
+                               case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+                                       // DOM0 で Silverlight ってあるの -> ie4 mobile?\r
+                                       list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
+                                       list.sltoken    = raw.AddEventListener( type, list.slcallback );\r
+                                       break;                          \r
+                               \r
+                               case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+                                       // ie4 mobile は XHR をサポート!\r
+                                       raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
+                                       break;\r
+\r
+                               default :\r
+                                       raw[ 'on' + type ] = that[ '_listeners' ]._handleEvent || ( that[ '_listeners' ]._handleEvent = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
+                                       break;\r
                        };\r
                });\r
 \r
@@ -610,82 +638,97 @@ function X_EventDispatcher_removeEvent( that, type, raw, list, skip ){
 };\r
 \r
 var X_EventDispatcher_actualRemoveEvent =\r
-       X_UA_EVENT.W3C /*&& ( X_UA.WebKit < 525.13 || X_UA.Opera7 || X_UA.NetFront < 4 )*/ ? // Safari3-\r
+       X_UA_EVENT.W3C ?\r
                (function( that, type, raw, list, skip ){\r
-                       if( that._isXHR && X_UA.Opera < 12 ){\r
-                               X_Callback_correct( raw[ 'on' + type ] );\r
-                               raw[ 'on' + type ] = '';\r
-                       } else  \r
-                       if( that._isSilverlight ){\r
-                               raw.RemoveEventListener( type, list.sltoken ); // token\r
-                               X_Callback_correct( list.slcallback );\r
-                               delete list.sltoken;\r
-                               delete list.slcallback;\r
-                       } else\r
-                       if( ( X_UA.WebKit || X_UA.Blink ) &&\r
-                               ( type === 'webkitTransitionEnd' || type === 'transitionend' ||\r
-                                 type === 'animationend'        || type === 'webkitAnimationEnd' ||\r
-                                 type === 'animationstart'      || type === 'webkitAnimationStart' ||\r
-                                 type === 'animationiteration'  || type === 'webkitAnimationIteration' ) ){\r
-                               raw.removeEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
-                       } else {\r
-                                                               \r
-                               if( raw.addEventListener ){\r
-                                       raw.removeEventListener( type, that._handleEvent, false );\r
-                               } else {\r
-                                       raw[ 'on' + type ] = null;\r
-                               };\r
-                               if( !skip ){\r
-                                       X_Callback_correct( that._handleEvent );\r
-                                       delete that._handleEvent;\r
-                               };\r
+                       switch( that[ '_rawType' ] ){\r
+                               case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+                                       raw.RemoveEventListener( type, list.sltoken ); // token\r
+                                       X_Callback_correct( list.slcallback );\r
+                                       delete list.sltoken;\r
+                                       delete list.slcallback;\r
+                                       break;\r
+                               \r
+                               case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+                                       if( X_UA.Opera < 12 ){\r
+                                               // Opera11- の XHR は event オブジェクトが返らないため, eventType 毎に callback を指定する addEventListener もない\r
+                                               X_Callback_correct( raw[ 'on' + type ] );\r
+                                               raw[ 'on' + type ] = '';\r
+                                               break;\r
+                                       };\r
+\r
+                               default :\r
+                                       if( ( X_UA.WebKit || X_UA.Blink ) &&\r
+                                               ( type === 'webkitTransitionEnd' || type === 'transitionend' ||\r
+                                                 type === 'animationend'        || type === 'webkitAnimationEnd' ||\r
+                                                 type === 'animationstart'      || type === 'webkitAnimationStart' ||\r
+                                                 type === 'animationiteration'  || type === 'webkitAnimationIteration' ) ){\r
+                                               raw.removeEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
+                                       } else                  \r
+                                       if( raw.addEventListener ){\r
+                                               raw.removeEventListener( type, that[ '_listeners' ]._handleEvent, false );\r
+                                       } else {\r
+                                               raw[ 'on' + type ] = null;\r
+                                       };\r
+                                       \r
+                                       if( !skip && that[ '_listeners' ]._handleEvent ){\r
+                                               X_Callback_correct( that[ '_listeners' ]._handleEvent );\r
+                                               delete that[ '_listeners' ]._handleEvent;\r
+                                       };\r
                        };\r
                }) :\r
        X_UA_EVENT.IE ?\r
                (function( that, type, raw, list, skip ){\r
-                       if( that._isXHR ){\r
-                               X_Callback_correct( raw[ 'on' + type ] );\r
-                               raw[ 'on' + type ] = X.emptyFunction;\r
-                               raw[ 'on' + type ] = '';\r
-                       } else  \r
-                       if( that._isSilverlight ){\r
-                               raw.RemoveEventListener( type, list.sltoken ); // token\r
-                               X_Callback_correct( list.slcallback );\r
-                               delete list.sltoken;\r
-                               delete list.slcallback;\r
-                       } else {\r
-                               if( raw.attachEvent ){\r
-                                       raw.detachEvent( 'on' + type, that._handleEvent );\r
-                               } else {\r
+                       switch( that[ '_rawType' ] ){\r
+                               case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+                                       raw.RemoveEventListener( type, list.sltoken ); // token\r
+                                       X_Callback_correct( list.slcallback );\r
+                                       delete list.sltoken;\r
+                                       delete list.slcallback;\r
+                                       break;\r
+                               \r
+                               case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+                                       X_Callback_correct( raw[ 'on' + type ] );\r
                                        raw[ 'on' + type ] = X.emptyFunction;\r
                                        raw[ 'on' + type ] = '';\r
-                               };\r
-                               \r
-                               if( !skip ){\r
-                                       X_Callback_correct( that._handleEvent );\r
-                                       delete that._handleEvent;\r
-                               };\r
+                                       break;\r
+\r
+                               default :\r
+                                       if( raw.attachEvent ){\r
+                                               raw.detachEvent( 'on' + type, that[ '_listeners' ]._handleEvent );\r
+                                       } else {\r
+                                               raw[ 'on' + type ] = X.emptyFunction;\r
+                                               raw[ 'on' + type ] = '';\r
+                                       };\r
+                                       \r
+                                       if( !skip ){\r
+                                               X_Callback_correct( that[ '_listeners' ]._handleEvent );\r
+                                               delete that[ '_listeners' ]._handleEvent;\r
+                                       };\r
                        };\r
                }) :\r
                (function( that, type, raw, list, skip ){\r
-                       if( that._isXHR ){\r
-                               X_Callback_correct( raw[ 'on' + type ] );\r
-                               raw[ 'on' + type ] = X.emptyFunction;\r
-                               raw[ 'on' + type ] = '';\r
-                       } else\r
-                       if( that._isSilverlight ){\r
-                               raw.RemoveEventListener( type, list.sltoken ); // token\r
-                               X_Callback_correct( list.slcallback );\r
-                               delete list.sltoken;\r
-                               delete list.slcallback;\r
-                       } else {\r
-                               raw[ 'on' + type ] = X.emptyFunction;\r
-                               raw[ 'on' + type ] = '';\r
+                       switch( that[ '_rawType' ] ){\r
+                               case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+                                       raw.RemoveEventListener( type, list.sltoken ); // token\r
+                                       X_Callback_correct( list.slcallback );\r
+                                       delete list.sltoken;\r
+                                       delete list.slcallback;\r
+                                       break;\r
                                \r
-                               if( !skip ){\r
-                                       X_Callback_correct( that._handleEvent );\r
-                                       delete that._handleEvent;\r
-                               };\r
+                               case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+                                       X_Callback_correct( raw[ 'on' + type ] );\r
+                                       raw[ 'on' + type ] = X.emptyFunction;\r
+                                       raw[ 'on' + type ] = '';\r
+                                       break;\r
+\r
+                               default :\r
+                                       raw[ 'on' + type ] = X.emptyFunction;\r
+                                       raw[ 'on' + type ] = '';\r
+                                       \r
+                                       if( !skip ){\r
+                                               X_Callback_correct( that[ '_listeners' ]._handleEvent );\r
+                                               delete that[ '_listeners' ]._handleEvent;\r
+                                       };\r
                        };\r
                });\r
 \r
@@ -762,13 +805,14 @@ if( X_UA.WebKit < 525.13 ){ // Safari3-
 // イベントの退避、dom が画面から抜かれる場合に実施しておく\r
 // 退避したイベントの復帰\r
 function X_EventDispatcher_toggleAllEvents( that, add ){\r
-       var list = that._listeners,\r
+       var list = that[ '_listeners' ],\r
                raw  = that._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( that ),\r
                f    = add ? X_EventDispatcher_addEvent : X_EventDispatcher_removeEvent,\r
                type;\r
        if( !list || !raw ) return;\r
        for( type in list ){\r
                //if( X_EMPTY_OBJECT[ type ] ) continue;\r
+               if( type.charAt( 0 ) === '_' ) continue;\r
                // 数字イベントの除外\r
                if( '' + parseFloat( type ) !== type ){\r
                        // TODO type rename はここ\r
index 9dbfe40..2954501 100644 (file)
@@ -114,7 +114,7 @@ X.Timer = {
                var list = X_Timer_TICKET_LIST,\r
                        i    = list.length,\r
                        l    = i,\r
-                       f, q;\r
+                       f, q, eventDispatcher, lazy, listeners;\r
                // fire 中の cancel\r
                if( X_Timer_busyTimeout ){\r
                        if( !X_Timer_removal ) X_Timer_removal = {};\r
@@ -123,6 +123,26 @@ X.Timer = {
                        for( ; i; ){\r
                                if( ( q = list[ --i ] ).uid === uid ){\r
                                        list.splice( i, 1 );\r
+                                       \r
+                                       /*\r
+                                        * lazyDispatch 中の EventDispatcher の有無を調べる\r
+                                        */\r
+                                       if( X_EventDispatcher_LAZY_TIMERS[ uid ] ){\r
+                                               eventDispatcher = X_EventDispatcher_LAZY_TIMERS[ uid ];\r
+                                               delete X_EventDispatcher_LAZY_TIMERS[ uid ];\r
+                                               \r
+                                               listeners = eventDispatcher[ '_listeners' ];\r
+                                               if( listeners && !listeners._dispatching && listeners._killReserved ){\r
+                                                       for( uid in X_EventDispatcher_LAZY_TIMERS ){\r
+                                                               if( X_EventDispatcher_LAZY_TIMERS[ uid ] === eventDispatcher ){\r
+                                                                       lazy = true;\r
+                                                                       break;\r
+                                                               };\r
+                                                       };                                              \r
+                                                       !lazy && eventDispatcher.kill();\r
+                                               };\r
+                                       };\r
+                                       \r
                                        !X_Timer_skipUpdate && ( q.last <= X_Timer_waitTime || l === 1 ) && X_Timer_update();\r
                                        break;\r
                                };\r
index 26060f5..cbfcdf6 100644 (file)
@@ -9,7 +9,7 @@ var
                STYLE_IS_INVISIBLE     : 2 <<  2, // visibility : hidden or opacity : 0\r
                STYLE_IS_POS_ABSOLUTE  : 2 <<  3, // position   : absolute\r
                STYLE_IS_NO_OVERFLOW   : 2 <<  4, // overflow   : hidden\r
-               STYLE_IS_WIDTH_LENGTH  : 2 <<  5, // width  : width() のための commitUpdate が不要\r
+               STYLE_IS_WIDTH_LENGTH  : 2 <<  5, // width  : overflow:hidden,要素無し、または要素が非表示なら、 width() のための commitUpdate が不要\r
                STYLE_IS_WIDTH_PCT     : 2 <<  6, // width  : width() のための commitUpdate が不要かもしれない。(親で LENGTH が指定されているなら)\r
                STYLE_IS_HEIGHT_LENGTH : 2 <<  7, // height :\r
                STYLE_IS_HEIGHT_PCT    : 2 <<  8, // height :\r
@@ -18,34 +18,33 @@ var
 \r
                DIRTY_POSITION         : 2 << 11, // 要素位置の変更が起こった。\r
                DIRTY_CONTENT          : 2 << 12, // width, height, x, y textNode の内容 TODO html と排他なので ID と共通でいい\r
-               DIRTY_ID               : 2 << 13, // width, height, x, y\r
-               DIRTY_CLASSNAME        : 2 << 14, // X_Node_CSS_getCharSize, width, height, x, y\r
-               DIRTY_ATTR             : 2 << 15, // X_Node_CSS_getCharSize, width, height, x, y\r
-               DIRTY_CSS              : 2 << 16, // X_Node_CSS_getCharSize, width, height, x, y\r
-               DIRTY_IE_FILTER        : X_UA.IE < 10 && X_UA.ActiveX ? 2 << 17 : 0, // \r
+               DIRTY_ID               : 2 << 12, // width, height, x, y\r
+               DIRTY_CLASSNAME        : 2 << 13, // X_Node_CSS_getCharSize, width, height, x, y\r
+               DIRTY_ATTR             : 2 << 14, // X_Node_CSS_getCharSize, width, height, x, y\r
+               DIRTY_CSS              : 2 << 15, // X_Node_CSS_getCharSize, width, height, x, y\r
+               DIRTY_IE_FILTER        : X_UA.IE < 10 && X_UA.ActiveX ? 2 << 16 : 0, // \r
 \r
-               \r
-               ELM_NEED_INIT          : 2 << 18,\r
-               OLD_ATTRTEXT           : 2 << 19,\r
-               OLD_CSSTEXT            : 2 << 20,\r
+               ACTUAL_LISTENING       : 2 << 17,\r
+               OLD_ATTRTEXT           : 2 << 18,\r
+               OLD_CSSTEXT            : 2 << 19,\r
 \r
                // filter 要素が親子になると不具合が出るのを検出\r
-               IE_FILTER_NOW          : 2 << 21,\r
+               IE_FILTER_NOW          : 2 << 20,\r
 \r
                //GPU_WAITING            : 2 << 20, // 1:子のGPU解除待\r
-               GPU_RESERVED           : 2 << 22, // 2:GPU予約\r
-               GPU_NOW                : 2 << 23, // 3:GPU now!\r
-               GPU_RELEASE_RESERVED   : 2 << 24, // 4:GPU解除予約\r
+               GPU_RESERVED           : 2 << 21, // 2:GPU予約\r
+               GPU_NOW                : 2 << 22, // 3:GPU now!\r
+               GPU_RELEASE_RESERVED   : 2 << 23, // 4:GPU解除予約\r
                \r
-               IE4_HAS_TEXTNODE       : X_UA.IE4 ? 2 << 22 : 0,\r
-               IE4_HAS_ELEMENT        : X_UA.IE4 ? 2 << 23 : 0,\r
-               IE4_DIRTY_CHILDREN     : X_UA.IE4 ? 2 << 24 : 0,\r
-               IE4_FIXED              : X_UA.IE4 ? 2 << 25 : 0,\r
+               IE4_HAS_TEXTNODE       : X_UA.IE4 ? 2 << 21 : 0,\r
+               IE4_HAS_ELEMENT        : X_UA.IE4 ? 2 << 22 : 0,\r
+               IE4_DIRTY_CHILDREN     : X_UA.IE4 ? 2 << 23 : 0,\r
+               IE4_FIXED              : X_UA.IE4 ? 2 << 24 : 0,\r
                \r
-               IE5_DISPLAY_NONE_FIX   : X_UA.IE5 && X_UA.ActiveX ? 2 << 25 : 0\r
+               IE5_DISPLAY_NONE_FIX   : X_UA.IE5 && X_UA.ActiveX ? 2 << 24 : 0\r
        },\r
 \r
-       X_Node_BITMASK_RESET_STYLE = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ (\r
+       X_Node_BITMASK_RESET_STYLE  = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ (\r
                X_Node_State.STYLE_IS_DISPLAY_NONE |\r
                X_Node_State.STYLE_IS_INVISIBLE |\r
                X_Node_State.STYLE_IS_POS_ABSOLUTE |\r
@@ -57,15 +56,15 @@ var
                X_Node_State.STYLE_IS_FONT_LENGTH |\r
                X_Node_State.STYLE_IS_FONT_PCT ),\r
 \r
-       X_Node_BitMask_IS_DIRTY = X_Node_State.DIRTY_POSITION | \r
+       X_Node_BitMask_IS_DIRTY     = X_Node_State.DIRTY_POSITION | \r
                X_Node_State.DIRTY_CONTENT | X_Node_State.DIRTY_ID | X_Node_State.DIRTY_CLASSNAME |\r
                X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_CSS | X_Node_State.DIRTY_IE_FILTER,\r
 \r
-       X_Node_BitMask_RESET_DIRTY = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ X_Node_BitMask_IS_DIRTY,\r
+       X_Node_BitMask_RESET_DIRTY  = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ X_Node_BitMask_IS_DIRTY,\r
        \r
-       X_Node_BitMask_RESET_GPU = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ ( X_Node_State.GPU_RESERVED | X_Node_State.GPU_NOW | X_Node_State.GPU_RELEASE_RESERVED ),\r
+       X_Node_BitMask_RESET_GPU    = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ ( X_Node_State.GPU_RESERVED | X_Node_State.GPU_NOW | X_Node_State.GPU_RELEASE_RESERVED ),\r
        \r
-       X_Node_BitMask_IE4_IS_MIX = X_Node_State.IE4_HAS_TEXTNODE | X_Node_State.IE4_HAS_ELEMENT,\r
+       X_Node_BitMask_IE4_IS_MIX   = X_Node_State.IE4_HAS_TEXTNODE | X_Node_State.IE4_HAS_ELEMENT,\r
        \r
        X_Node_TYPE = {\r
                XNODE       : 1,\r
@@ -106,7 +105,7 @@ var
                _uid       : 0,\r
                _flags     : X_Node_State.DESTROYED,\r
 \r
-               _rawObject : null,\r
+               // _rawObject : null,\r
                _rect      : null, // \r
                _fontSize  : 0,\r
                \r
@@ -224,7 +223,7 @@ var
                \r
                appendTo       : X_Node_appendTo,\r
                \r
-               appendToRoot   : X_Node_appendToRoot,\r
+               appendToRoot   : X_Node_appendToRoot, // remove\r
                \r
                before         : X_Node_before, // remove\r
                \r
@@ -676,27 +675,29 @@ function X_Node_destroy( isChild ){
 };\r
 \r
 function X_Node_onBeforeKill( e ){\r
-       var xnodes = this._xnodes,\r
-               elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ),\r
-               i;\r
-       \r
-       if( !this._flags ) return;\r
+       var xnodes = this._xnodes, i, elm;\r
        \r
-       delete X_Node_CHASHE[ this._uid ];\r
+       if( !this._flags ) return X.Callback.NONE;\r
        \r
+       elm = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
+       elm && this._listeners && this.unlisten(); // イベントの退避\r
+\r
        if( xnodes && ( i = xnodes.length ) ){\r
                for( ; i; ){\r
                        X_Node_onBeforeKill.call( xnodes[ --i ] );\r
                };\r
        };\r
 \r
-       e && this.remove();\r
-       elm && this._listeners && this.unlisten(); // イベントの退避\r
-       \r
-       if( e && elm && elm.parentNode && elm.parentNode.tagName ){\r
-               delete this._flags;\r
-               return X.Callback.PREVENT_DEFAULT;\r
+       delete X_Node_CHASHE[ this._uid ];\r
+\r
+       if( e ){\r
+               this.remove();\r
+               if( X_Node_reserveRemoval[ X_Node_reserveRemoval.length - 1 ] === this ){\r
+                       delete this._flags;\r
+                       return X.Callback.PREVENT_DEFAULT;              \r
+               };              \r
        };\r
+       return X.Callback.NONE;\r
 };\r
 \r
 \r
@@ -1039,6 +1040,7 @@ function X_Node_startUpdate( time ){
        if( i = removal.length ){\r
                for( ; i; ){\r
                        xnode = removal[ --i ];\r
+                       // TODO GPU レイヤーの子の場合、remove をスキップする。 非GPU レイヤーへ apppend される場合、clone する?\r
                        X_Node__actualRemove( xnode );\r
                        !xnode._flags && xnode.kill();\r
                };\r
@@ -1066,8 +1068,8 @@ function X_Node_startUpdate( time ){
 };\r
 \r
 /*\r
- * 1. GPU_NOW の場合、これ以下の一切の更新を行わない\r
- * 2. GPU解放予約 の場合、この要素のみ変更を行う。rAF 後にさらに更新するためフラグを立てる。\r
+ * 1. GPU_NOW の場合、子の変更は行わない\r
+ * 2. GPU解放予約 の場合//、この要素のみ変更を行う。rAF 後にさらに更新するためフラグを立てる。\r
  * 3. GPU予約 -> GPU\r
  * 4. style="display:none" の場合、これ以下の変更を行わない。\r
  * 5. ie5 非表示フラグが立っていて、親と自身の class・id によって非表示になっていて、親と自身に変更がない。accumulatedFlags を使用。\r
@@ -1118,7 +1120,7 @@ var X_Node__commitUpdate =
                                        return nextElement;\r
                                };\r
                                elm && ( elm.style.display = 'none' );\r
-                               return elm.nextSibling === nextElement ? elm : nextElement;\r
+                               return ( elm && elm.nextSibling === nextElement ) ? elm : nextElement;\r
                        };\r
                        \r
                        // 5. ie5 非表示fixフラグ\r
@@ -1140,7 +1142,7 @@ var X_Node__commitUpdate =
                                        };\r
                                } else\r
                                if( X_Node_strictElmCreation ){\r
-                                       that._flags & X_Node_State.DIRTY_CSS && X_Node_CSS_objToCssText( that, true );\r
+                                       that._flags & X_Node_State.OLD_CSSTEXT && X_Node_CSS_objToCssText( that, true ); // OLD_CSSTEXT ??\r
                \r
                                        that._rawObject = elm =\r
                                                document.createElement( [\r
@@ -1148,9 +1150,9 @@ var X_Node__commitUpdate =
                                                                ' 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
+                                                               X_Node_Attr_objToAttrText( that, true ),\r
                                                                that._cssText ? ' style="' + that._cssText + '"' : '',\r
-                                                       '>' ].join( '' ) );             \r
+                                                       '>' ].join( '' ) );\r
                                } else {\r
                                        that._rawObject = elm = document.createElement( that._tag );\r
                                };\r
@@ -1163,18 +1165,17 @@ var X_Node__commitUpdate =
                                };\r
 \r
                                if( that._tag ){\r
-                                       // src の onload があるので先ではないか?\r
-                                       // TODO ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
                                        X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰                                \r
+                                       that._flags |= X_Node_State.ACTUAL_LISTENING;\r
                                        \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
+                                               // ie の string から要素を作る場合、ネットワーク系属性は onload イベントなどを拾うために、要素生成->イベント復帰後に適用する\r
+                                               that._newAttrs && ( that._flags |= X_Node_State.DIRTY_ATTR ); // Network 系の属性は遅らせて設定\r
                                                that._flags |= X_Node_State.DIRTY_IE_FILTER;// doc 追加後に filter を指定しないと有効にならない。\r
                                        } else {\r
                                                elm.UID = that._uid;\r
@@ -1185,7 +1186,7 @@ var X_Node__commitUpdate =
                                                // 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
+                                                       if( that._tag === 'IFRAME' && ( !that._attrs || !that._attrs[ 'src' ] ) ){\r
                                                                //elm.contentWindow.location.replace = elm.src = 'about:blank';\r
                                                                that.attr( 'src', 'about:blank' );\r
                                                        };\r
@@ -1200,19 +1201,19 @@ var X_Node__commitUpdate =
                                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
+                       if( that._listeners && ( that._flags & X_Node_State.ACTUAL_LISTENING ) === 0 ){\r
+                               X_EventDispatcher_toggleAllEvents( that, true );// イベントの退避\r
+                               that._flags |= X_Node_State.ACTUAL_LISTENING;\r
+                       };\r
                        \r
                        // 8. 更新の適用\r
-                       if( accumulatedFlags & X_Node_BitMask_IS_DIRTY ) delete that._fontSize;\r
-                       \r
-                       that._flags & X_Node_BitMask_IS_DIRTY && X_Node__updateRawNode( that, elm );\r
-                               \r
-                       \r
+                       if( accumulatedFlags & X_Node_BitMask_IS_DIRTY ){\r
+                               delete that._fontSize;\r
+                               X_Node__updateRawNode( that, elm );\r
+                       };\r
+\r
                        // 9. ie5 only\r
                        // 親及び自身へのクラス・id指定で display : none になるケースがありそれを検出\r
                        // 生成と破棄が繰り返されてしまう、親と自身の id, class が変わった場合だけ再生成。 accumulatedFlags & ( ID | CLASSNAME )\r
@@ -1266,7 +1267,7 @@ var X_Node__commitUpdate =
                                                return prevElement;\r
                                        };\r
                                };\r
-                               return elm || nextElement;\r
+                               return elm || prevElement;\r
                        };\r
                        \r
                        if( !elm ){\r
@@ -1341,7 +1342,6 @@ var X_Node__commitUpdate =
                (function(){});\r
 \r
 /*\r
- * TODO IE5 は filter-fix があるため、親から変更を適用し、自信の display:none を調べる\r
  * GPU レイヤーするブラウザは、子要素から変更を当てていく? <- とりあえず、親要素から。\r
  */\r
 var X_Node__updateRawNode =\r
@@ -1416,7 +1416,6 @@ var X_Node__updateRawNode =
                                } else {\r
                                        elm.style.cssText = ''; // IE5.5以下 Safari3.2 で必要\r
                                        elm.removeAttribute( 'style' );\r
-                                       delete that._cssText;\r
                                };\r
                        } else\r
                        if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
@@ -1461,7 +1460,6 @@ var X_Node__updateRawNode =
                                } else {\r
                                        elm.style.cssText = '';\r
                                        elm.removeAttribute( 'style' );\r
-                                       delete that._cssText;\r
                                };\r
                        } else\r
                        if( that._flags & X_Node_State.DIRTY_IE_FILTER ){\r
@@ -1519,12 +1517,12 @@ var X_Node__actualCreate =
                } else {\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
+                       that._flags & X_Node_State.OLD_CSSTEXT && X_Node_CSS_objToCssText( that, true );\r
                        \r
                        html = [\r
                                '<', that._tag, ' id=', ( that._id || ( 'ie4uid' + uid ) ), ' UID="', uid, '"',\r
                                that._className ? ' class="' + that._className + '"' : '',\r
-                               that._flags & X_Node_State.OLD_ATTRTEXT ? X_Node_Attr_objToAttrText( that ) : that._attrText,\r
+                               X_Node_Attr_objToAttrText( that, true ),\r
                                that._cssText ? ' style="' + that._cssText + '"' : '',\r
                        '>' ];\r
                        \r
@@ -1557,7 +1555,7 @@ var X_Node__actualCreate =
                        };\r
                        X_Dom_DTD_EMPTY[ that._tag ] || ( html[ n ] = '<\/' + that._tag + '>' );\r
                        \r
-                       delete that._newAttrs;\r
+                       that._newAttrs && ( that._flags |= X_Node_State.DIRTY_ATTR );\r
                };\r
                \r
                return html.join( '' );\r
@@ -1574,8 +1572,12 @@ var X_Node__afterActualCreate =
                                X_Node__afterActualCreate( xnodes[ --i ] );\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
+               // ネットわーう系属性と filter は要素生成後に適用\r
+               if( that._flags & ( X_Node_State.DIRTY_ATTR | X_Node_State.DIRTY_IE_FILTER ) ){\r
+                       X_Node__updateRawNode( that, that._rawObject || X_Node__ie4getRawNode( that ) );\r
+               } else {\r
+                       that._flags &= X_Node_BitMask_RESET_DIRTY;\r
+               };\r
                X_EventDispatcher_toggleAllEvents( that, true );// イベントの復帰\r
        });\r
 \r
@@ -1597,7 +1599,10 @@ var X_Node__actualRemove =
 \r
                        if( !elm ) return;\r
                        \r
-                       that._listeners && X_EventDispatcher_toggleAllEvents( that, false );// イベントの退避\r
+                       if( that._flags & X_Node_State.ACTUAL_LISTENING ){\r
+                               that._listeners && X_EventDispatcher_toggleAllEvents( that, false );// イベントの退避\r
+                               that._flags &= ~X_Node_State.ACTUAL_LISTENING;\r
+                       };\r
                        \r
                        // ie5では filter の効いている要素をremove時に破棄して、再度append 時に新規生成する\r
                        // ちなみに elm.filters に触ると ie8 でなぜかカラム落ちが発生、、、\r
@@ -1606,10 +1611,23 @@ var X_Node__actualRemove =
                                        //elm.style.removeAttribute( 'filter' );\r
                                        isChild = false;\r
                                        delete that._rawObject;\r
-                                       // 破棄前に value を控える TODO checked, selected も!\r
+                                       // 破棄前にインタラクティブな属性値を控える\r
                                        if( X_Node_Attr_HAS_VALUE[ that._tag ] && ( !that._newAttrs || !X_Object_inObject( 'value', that._newAttrs ) ) ){\r
+                                               if( !that._attrs ) that._attrs = {};\r
                                                that._attrs.value = elm.value;\r
                                        };\r
+                                       if( that._tag === 'OPTION' && ( !that._newAttrs || !X_Object_inObject( 'selected', that._newAttrs ) ) ){\r
+                                               if( !that._attrs ) that._attrs = {};\r
+                                               that._attrs.selected = elm.selected;\r
+                                       };\r
+                                       if( that._tag === 'SELECT' && ( !that._newAttrs || !X_Object_inObject( 'selectedIndex', that._newAttrs ) ) ){\r
+                                               if( !that._attrs ) that._attrs = {};\r
+                                               that._attrs.selectedIndex = elm.selectedIndex;\r
+                                       };\r
+                                       if( that._tag === 'INPUT' && that._attr && ( that._attr.type === 'checkbox' || that._attr.type === 'radio' ) && ( !that._newAttrs || !X_Object_inObject( 'checked', that._newAttrs ) ) ){\r
+                                               that._attrs.checked = elm.checked;\r
+                                       };\r
+                                       // 子要素への参照を外す\r
                                        elm.innerHTML = '';\r
                                };\r
                        };\r
@@ -1635,10 +1653,24 @@ var X_Node__actualRemove =
                        if( !elm ) return;\r
                        that._listeners && X_EventDispatcher_toggleAllEvents( that, false );// イベントの退避\r
                        \r
-                       // 破棄前に value を控える TODO checked, selected も!\r
+                       // 破棄前にインタラクティブな属性値を控える\r
                        if( X_Node_Attr_HAS_VALUE[ that._tag ] && ( !that._newAttrs || !X_Object_inObject( 'value', that._newAttrs ) ) ){\r
+                               if( !that._attrs ) that._attrs = {};\r
                                that._attrs.value = elm.value;\r
                        };\r
+                       if( that._tag === 'OPTION' && ( !that._newAttrs || !X_Object_inObject( 'selected', that._newAttrs ) ) ){\r
+                               if( !that._attrs ) that._attrs = {};\r
+                               that._attrs.selected = elm.selected;\r
+                       };\r
+                       if( that._tag === 'SELECT' && ( !that._newAttrs || !X_Object_inObject( 'selectedIndex', that._newAttrs ) ) ){\r
+                               if( !that._attrs ) that._attrs = {};\r
+                               that._attrs.selectedIndex = elm.selectedIndex;\r
+                       };\r
+                       if( that._tag === 'INPUT' && that._attr && ( that._attr.type === 'checkbox' || that._attr.type === 'radio' ) && ( !that._newAttrs || !X_Object_inObject( 'checked', that._newAttrs ) ) ){\r
+                               if( !that._attrs ) that._attrs = {};\r
+                               that._attrs.checked = elm.checked;\r
+                       };\r
+\r
                        elm.removeAttribute( 'id' ); // ?\r
                        //document.all[ that._id || ( 'ie4uid' + that._uid ) ] = null; // MacIE5 でエラー\r
                        if( !isChild ) elm.outerHTML = '';\r
index cd9a1ff..cd04236 100644 (file)
@@ -61,57 +61,77 @@ X_Node_Attr_STATIC_VALUE_TYPES = {
        checkbox : true\r
 },\r
 \r
+// 自由な内容が入るため、参照文字への変換が必要\r
+X_Node_Attr_toChrReferance = {\r
+       value : true,\r
+       title : true,\r
+       alt   : true\r
+},\r
+\r
 X_Node_Attr_renameForTag = {};\r
        // http://nanto.asablo.jp/blog/2005/10/29/123294\r
        // checked -> defaultChecked\r
        // 動的に生成した input 要素を文書ツリーに挿入する前に設定した checked 属性は反映されず、defaultChecked だと反映される\r
        // ロードイベントを拾うために、要素生成時にネットワーク関連の属性を設定しない。\r
        //  -> src (img, iframe, ), link の href, <param name="movie" src=>\r
-function X_Node_Attr_objToAttrText( that, skipNetwork, escape ){ // TODO value の escape " -> &quot;\r
+       // \r
+function X_Node_Attr_objToAttrText( that, skipNetworkForElmCreation ){\r
        var obj     = that._attrs,\r
                noValue = X_Node_Attr_noValue,\r
                attrs   = [ '' ], // 先頭にスペース\r
                plain   = X_EMPTY_OBJECT,\r
-               n = 0, k, hasNetwork;\r
-\r
-       that._flags &= ~X_Node_State.OLD_ATTRTEXT;\r
+               n = 0, k, check;\r
 \r
+       if( skipNetworkForElmCreation ){\r
+               delete that._newAttrs;\r
+               // このあとで _newAttr にネットワーク系の属性を控える, attrText には加えない\r
+       } else {\r
+               that._flags &= ~X_Node_State.OLD_ATTRTEXT;\r
+               // 完全な attrText\r
+       };\r
+       \r
        if( !obj ){ // Opera7\r
                delete that._attrText;\r
                return '';\r
        };\r
+       \r
        for( k in obj ){\r
                if( plain[ k ] ) continue;\r
                \r
-               if( skipNetwork ){\r
-                       switch( k ){\r
-                               case 'value' :\r
-                                       if( that._tag === 'LINK' && that._attr && that._attr.name === 'movie' ){\r
-                                               hasNetwork = true;\r
-                                               continue;\r
-                                       };\r
-                                       break;\r
+               if( skipNetworkForElmCreation ){\r
+                       check = false;\r
+                       switch( that._tag + k ){\r
+                               case 'PARAMvalue' :\r
+                                       check = obj[ 'name' ] !== 'movie';\r
+                               case 'INPUTsrc'  :\r
+                                       check = check || ( obj[ 'type' ] !== 'image' );\r
+                               case 'LINKhref' :\r
+                                       check = check || ( obj[ 'rel' ] !== 'stylesheet' );\r
                                        \r
-                               case 'src' :\r
-                                       hasNetwork = true;\r
+                                       if( !check ) break;\r
+\r
+                               case 'IMGsrc'     :\r
+                               case 'IFRAMEsrc'  :\r
+                               case 'FRAMEsrc'   :\r
+                               case 'SCRIPTsrc'  :\r
+                               case 'EMBEDsrc'   :\r
+                               case 'OBJECTdata' :\r
+                               case 'BGSOUNDsrc' :\r
+                               case 'APPLETcode' :\r
+                               //case 'AUDIOsrc' :\r
+                               //case 'VIDEOsrc' :\r
+                                       if( !that._newAttrs ) that._newAttrs = {};\r
+                                       that._newAttrs[ k ] = obj[ k ];\r
                                        continue;\r
-                                       \r
-                               case 'href' :\r
-                                       if( that._tag === 'LINK' ){\r
-                                               hasNetwork = true;\r
-                                               continue;\r
-                                       };\r
                        };\r
                };\r
 \r
                attrs[ ++n ] = noValue[ k ] ? k : [\r
                        k, '="',\r
-                       k === 'value' ? X_String_toChrReferance( obj[ k ] ) : obj[ k ],\r
+                       X_Node_Attr_toChrReferance[ k ] ? X_String_toChrReferance( obj[ k ] ) : obj[ k ],\r
                        '"' ].join( '' );\r
        };\r
        \r
-       //if( hasNetwork ) that._flags |= X_Node_State.IE_NETWORK_ATTR\r
-       \r
        if( 0 < n ){\r
                return that._attrText = attrs.join( ' ' );\r
        };\r
index 1445907..a452ca6 100644 (file)
@@ -285,6 +285,7 @@ function X_Node_CSS_objToCssText( that, skipFilter ){
        };
        
        if( 0 <= n ){
+               // cssText には完全なものを控えるが、戻すのは filter を抜いたもの
                that._cssText = css.join( ';' );
                if( skipFilter ){
                        --css.length;
@@ -522,7 +523,7 @@ Node.prototype.css = function( nameOrObj /* orUnitID, valuOrUnitOrName */ ){
                        if( css[ name ] === v ) continue;
                        flags = X_Node_CSS_setStyle( css, flags, name, v );
                };
-               this._flags = flags | X_Node_State.DIRTY_CSS | X_Node_State.OLD_CSSTEXT;
+               this._flags |= X_Node_State.DIRTY_CSS | X_Node_State.OLD_CSSTEXT;
                this._flags & X_Node_State.IN_TREE && X_Node_reserveUpdate();
                delete this._cssText;
                return this;
index 140f78a..1d7a23e 100644 (file)
@@ -472,24 +472,26 @@ function X_Node_Anime_updatePosition( xnode, x, y, opacity, useGPU ){
                });\r
        };\r
 \r
-       if( useGPU ){\r
-               if( xnode._flags & X_Node_State.GPU_RELEASE_RESERVED ){\r
-                       xnode._flags &= X_Node_BitMask_RESET_GPU;\r
-                       xnode._flags |= X_Node_State.GPU_NOW;\r
-               } else\r
-               if( xnode._flags & X_Node_State.GPU_NOW ){\r
+       if( X_Node_Anime_translateZ ){\r
+               if( useGPU ){\r
+                       if( xnode._flags & X_Node_State.GPU_RELEASE_RESERVED ){\r
+                               xnode._flags &= X_Node_BitMask_RESET_GPU;\r
+                               xnode._flags |= X_Node_State.GPU_NOW;\r
+                       } else\r
+                       if( xnode._flags & X_Node_State.GPU_NOW ){\r
+                       } else {\r
+                               xnode._flags &= X_Node_BitMask_RESET_GPU;\r
+                               xnode._flags |= X_Node_State.GPU_RESERVED;\r
+                       };\r
                } else {\r
-                       xnode._flags &= X_Node_BitMask_RESET_GPU;\r
-                       xnode._flags |= X_Node_State.GPU_RESERVED;\r
-               };\r
-       } else {\r
-               if( xnode._flags & X_Node_State.GPU_NOW ){\r
-                       xnode._flags &= X_Node_BitMask_RESET_GPU;\r
-                       xnode._flags |= X_Node_State.GPU_RELEASE_RESERVED;                      \r
-               } else\r
-               if( xnode._flags & X_Node_State.GPU_RESERVED ){\r
-                       xnode._flags &= X_Node_BitMask_RESET_GPU;\r
-               };\r
+                       if( xnode._flags & X_Node_State.GPU_NOW ){\r
+                               xnode._flags &= X_Node_BitMask_RESET_GPU;\r
+                               xnode._flags |= X_Node_State.GPU_RELEASE_RESERVED;                      \r
+                       } else\r
+                       if( xnode._flags & X_Node_State.GPU_RESERVED ){\r
+                               xnode._flags &= X_Node_BitMask_RESET_GPU;\r
+                       };\r
+               };              \r
        };\r
 };\r
 \r
index 71d4770..fb35d5e 100644 (file)
@@ -85,9 +85,9 @@ if( X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X ){
        X_NET_XHRWrapper = X_Class_override(\r
                new X.EventDispatcher(),\r
                {\r
-                                               \r
+                       \r
+                       _rawType   : X_EventDispatcher_EVENT_TARGET_TYPE.XHR,\r
                        _rawObject : X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X,\r
-                       _isXHR     : true,  // X.EventDispatcher で使用 for ie8-\r
                        _isXDR     : false, // for ie8\r
                        \r
                        _method    : '',\r
index e64f3da..9a792fd 100644 (file)
@@ -22,7 +22,7 @@ if( X.Pulgin.SilverlightEnabled ){
                'X.AV.SilverlightAudioWrapper',\r
                X.Class.POOL_OBJECT,\r
                {\r
-                       _isSilverlight  : true, // for X.EventDispatcher.listen\r
+                       '_rawType'      : X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT,\r
                proxy           : null,\r
                \r
                        startTime       : 0,\r