* @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
e = delay;\r
delay = 0;\r
};\r
- return X.Timer.add( delay, 1, this, this.dispatch, [ e ] );\r
+ return this[ '_lastLazyID' ] = X.Timer.add( delay, 1, this, X_EventDispatcher_dispatch, [ e ] );\r
}\r
}\r
);\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
// _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
if( opt_type === undefined ){\r
// 全て削除\r
for( opt_type in list ){\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
list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
list.sltoken = raw.AddEventListener( type, list.slcallback );\r
} else\r
- if( X.UA.iOS && ( type === 'webkitTransitionEnd' || type === 'transitionend' ) ){\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
- \r
\r
if( raw.addEventListener ){\r
raw.addEventListener( type, that._handleEvent, false );\r
delete list.sltoken;\r
delete list.slcallback;\r
} else\r
- if( X.UA.iOS && ( type === 'webkitTransitionEnd' || type === 'transitionend' ) ){\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
type;\r
if( !list || !raw ) return;\r
for( type in list ){\r
+ //if( X_EMPTY_OBJECT[ type ] ) continue;\r
// 数字イベントの除外\r
if( '' + parseFloat( type ) !== type ){\r
// TODO type rename はここ\r