-/*\r
- * <p>EventDispatcher インスタンスのメンバ(_listeners)でイベントリスナをイベント名(string)やイベントID(5~以上の number, フレームワーク内で定義、5 以上になる理由は後述)をキーとする Array で記憶します。\r
- * Arrayには、__CallbackHash__ というハッシュ、または関数が蓄えられています。\r
+/**\r
+ * <p>EventDispatcher インスタンスのメンバ(_listeners)でイベントリスナをイベント名(string)や\r
+ * イベントID(5~以上の number, フレームワーク内で定義、5 以上になる理由は後述)をキーとする Array で記憶します。\r
+ * \r
+ * <p>Arrayには、__CallbackHash__ というハッシュ、または関数が蓄えられています。\r
+ * \r
+ * <p>また、イベントターゲット(EventDispatcher._rawObject)に渡された再利用可能クロージャの控えを _listeners[0] に記憶します。(ACTUAL_HANDLER)\r
* \r
- * また、dispatch 中の状態と操作を記録し不整合が起きないようにするためのプロパティを持ち、0 から 4 の番号が与えられています。\r
+ * <p>dispatch 中の状態と操作を記録し不整合が起きないようにするためのプロパティ(_listeners[1]~_listeners[4])を持ちます。イベントID が 5 から始まるのはこのためです。\r
* \r
* <dl>\r
* <dt>0:ACTUAL_HANDLER\r
* <dd>イベントターゲットの addEventListener 等に渡される実際の関数(再利用可能クロージャ)を控えています。\r
* <dt>1:DISPATCHING number\r
- * <dd>イベントディスパッチ中か?またディスパッチがネストした場合、その深さを記憶します。\r
+ * <dd>dispatch 中か?さらにインスタンス自身の dispatch がネストした場合、その深さを記憶します。\r
* <dt>2:RESERVES Array\r
- * <dd>ã\82¤ã\83\99ã\83³ã\83\88ç\99ºç\81«ä¸ã\81« listen() ã\81\8cå\91¼ã\81°ã\82\8cã\81\9få ´å\90\88ã\81«å¼\95æ\95°ã\82\92è\93\84ã\81\88ã\80\81å\85¨ã\81¦ã\81®ã\83\87ã\82£ã\82¹ã\83\91ã\83\83ã\83\81ã\81®å®\8cäº\86æ\99\82(_dispatching===0)に再度 listen() するための一時ストアです。\r
+ * <dd>ã\82¤ã\83\99ã\83³ã\83\88ç\99ºç\81«ä¸ã\81« listen() ã\81\8cå\91¼ã\81°ã\82\8cã\81\9få ´å\90\88ã\81«å¼\95æ\95°ã\82\92è\93\84ã\81\88ã\80\81å®\8cäº\86æ\99\82(DISPATCHING===0)に再度 listen() するための一時ストアです。\r
* <dt>3:UNLISTENS Array\r
- * <dd>ã\82¤ã\83\99ã\83³ã\83\88ç\99ºç\81«ä¸ã\81« unlisten() ã\81\8cå\91¼ã\81°ã\82\8cã\81\9få ´å\90\88ã\81«å¯¾è±¡ã\83ªã\82¹ã\83\8aã\82\92è¨\98æ\86¶ã\81\97ã\80\81ã\83ªã\82¹ã\83\8aã\81\8cå\91¼ã\81°ã\82\8cã\81ªã\81\84ã\82\88ã\81\86ã\81«ã\81\97ã\81¾ã\81\99ã\80\82å\85¨ã\81¦ã\81®ã\83\87ã\82£ã\82¹ã\83\91ã\83\83ã\83\81ã\81®å®\8cäº\86æ\99\82(_dispatching===0)に再度 unlisten() します。\r
+ * <dd>ã\82¤ã\83\99ã\83³ã\83\88ç\99ºç\81«ä¸ã\81« unlisten() ã\81\8cå\91¼ã\81°ã\82\8cã\81\9få ´å\90\88ã\81«å¯¾è±¡ã\83ªã\82¹ã\83\8aã\82\92è¨\98æ\86¶ã\81\97ã\80\81ã\83ªã\82¹ã\83\8aã\81\8cå\91¼ã\81°ã\82\8cã\81ªã\81\84ã\82\88ã\81\86ã\81«ã\81\97ã\81¾ã\81\99ã\80\82å®\8cäº\86æ\99\82(DISPATCHING===0)に再度 unlisten() します。\r
* <dt>4:KILL_RESERVED boolean\r
- * <dd>イベント発火中に kill() が呼ばれた場合に、全てのディスパッチの完了時(_dispatching===0)に再度 kill() するためのフラグです。\r
+ * <dd>dispatch 中に kill() が呼ばれた場合に一旦 kill をキャンセルし、完了時(DISPATCHING===0)に再度 kill() するためのフラグです。\r
* </dl>\r
+ * \r
+ * @class __X_EventDispatcher_Listeners__\r
+ * @private\r
+ * @abstract\r
*/\r
-var X_Listeners,\r
-\r
+var\r
/** @enum {number} */\r
- X_Listeners_ = {\r
+ X_Listeners_ =\r
+ /** @lends __X_EventDispatcher_Listeners__ */\r
+ {\r
ACTUAL_HANDLER : 0,\r
DISPATCHING : 1,\r
RESERVES : 2,\r
* Arrayには、{k:種類,x:コンテキスト(thisObject),f:関数,s:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
* \r
* @private\r
- * @type {X_Listeners}\r
+ * @type {__X_EventDispatcher_Listeners__}\r
*/\r
'_listeners' : null,\r
\r
},\r
\r
/**\r
- * delay(ミリ秒)後にイベントを dispatch する。戻り値は uid = X.Timer.add() のタイマーID(数値)。X.Timer.remove(uid) でタイマーを解除して dispatch を中止できる。\r
- * kill() 時には内部でまだ呼ばれていないタイマーの X.Timer.remove() が行われる。\r
+ * delay(ミリ秒)後にイベントを dispatch する。戻り値は uid = X.Timer.once() のタイマーID(数値)。X.Timer.remove(uid) でタイマーを解除して dispatch を中止できる。\r
+ * kill() 時には内部でまだ呼ばれていないタイマーの X.Timer.remove() が行われる。インスタンスが破棄された後にタイマーが呼ばれることがないので神経質にならなくても安全に使える。\r
* @example this.asyncDispatch( 'myevent' );\r
* // どちらのコードも同じ動作をする。\r
* this.asyncDispatch( 0, 'myevent' );\r
if( r & X.Callback.STOP_NOW ){\r
sysOnly = true;\r
};\r
- ret |= X.Type.isFinite( r ) ? r : 0;\r
+ ret |= X_Type_isFinite( r ) ? r : 0;\r
};\r
\r
if( ( --listeners[ X_Listeners_.DISPATCHING ] ) === 0 ){\r
return this;\r
};\r
\r
- if( X.Type.isArray( type ) ){\r
+ if( X_Type_isArray( type ) ){\r
for( i = type.length; i; ){\r
this.listen( type[ --i ], opt_arg1, opt_arg2, opt_arg3 );\r
};\r
};\r
\r
raw = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
- add = raw && ( !listeners || !listeners[ type ] ) && X.Type.isString( type );\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
list, reserves, unlistens, i, f, raw, k, empty;\r
if( !listeners ) return this;\r
\r
- if( X.Type.isArray( opt_type ) ){\r
+ if( X_Type_isArray( opt_type ) ){\r
for( i = opt_type.length; i; ){\r
this.unlisten( opt_type[ --i ], opt_arg1, opt_arg2, opt_arg3 );\r
if( !opt_type[ i ] ){\r
var i;\r
X_EventDispatcher_lock || ( type = X_Event_Rename[ type ] || type );\r
\r
- if( X.Type.isArray( type ) ){\r
+ if( X_Type_isArray( type ) ){\r
for( i = type.length; i; ){\r
X_EventDispatcher_systemListen( that, type[ --i ], X.emptyFunction );\r
console.log( 'events fix > ' + type[ i ] );\r
break;\r
\r
case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
- if( X_UA.Opera < 12 ){\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
default :\r
// iOS と MacOSX Iron36 で発生。連続してアニメーションが起こると、クロージャの束縛された obj へのアクセスに失敗する。Win では起きない?\r
// むしろ、MacOSX のブラウザ全般で起こる??\r
- if( ( X_UA.WebKit || X_UA.Blink ) &&\r
+ if( ( X_UA[ 'WebKit' ] || X_UA[ 'Blink' ] ) &&\r
( type === 'webkitTransitionEnd' || type === 'transitionend' ||\r
type === 'animationend' || type === 'webkitAnimationEnd' ||\r
type === 'animationstart' || type === 'webkitAnimationStart' ||\r
var i;\r
X_EventDispatcher_unlock || ( type = X_Event_Rename[ type ] || type );\r
\r
- if( X.Type.isArray( type ) ){\r
+ if( X_Type_isArray( type ) ){\r
for( i = type.length; i; ){\r
X_EventDispatcher_systemUnlisten( that, type[ --i ], X.emptyFunction );\r
};\r
break;\r
\r
case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
- if( X_UA.Opera < 12 ){\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
};\r
\r
default :\r
- if( ( X_UA.WebKit || X_UA.Blink ) &&\r
+ if( ( X_UA[ 'WebKit' ] || X_UA[ 'Blink' ] ) &&\r
( type === 'webkitTransitionEnd' || type === 'transitionend' ||\r
type === 'animationend' || type === 'webkitAnimationEnd' ||\r
type === 'animationstart' || type === 'webkitAnimationStart' ||\r
i, l;\r
//console.log( '>>>>>>>>>> ' + e.type );\r
// touch event -> pointer\r
- if( X.Type.isArray( ev ) ){\r
+ if( X_Type_isArray( ev ) ){\r
if( ev.length === 0 ){\r
// TouchEvent の後に発生した MouseEvent のキャンセル\r
ret = X.Callback.STOP_PROPAGATION | X.Callback.PREVENT_DEFAULT;\r
if( ret & X.Callback.PREVENT_DEFAULT ){\r
this._tag === 'A' && this._rawObject.blur();\r
e.preventDefault();\r
- if( X_UA.WebKit < 525.13 ){ // Safari3-\r
+ if( X_UA[ 'WebKit' ] < 525.13 ){ // Safari3-\r
if( e.type === 'click' || e.type === 'dbclick' ){\r
X_EventDispatcher_safariPreventDefault = true;\r
};\r
};\r
});\r
\r
-if( X_UA.WebKit < 525.13 ){ // Safari3-\r
+if( X_UA[ 'WebKit' ] < 525.13 ){ // Safari3-\r
document.documentElement.onclick =\r
document.documentElement.ondbclick = function( e ){\r
if( X_EventDispatcher_safariPreventDefault ){\r