X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F01_core%2F13_XEventDispatcher.js;h=8741a0fcc3116e95d93b3b0b186394da4ef5f472;hb=a130cabd01fde8865990a59d849f5d5d08ed2119;hp=29ec9391eef6251b6b807e60b23e65248b1861f9;hpb=9e30a8480de03f0b36d2411a0ecb7f1d0f47b61f;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/01_core/13_XEventDispatcher.js b/0.6.x/js/01_core/13_XEventDispatcher.js index 29ec939..8741a0f 100644 --- a/0.6.x/js/01_core/13_XEventDispatcher.js +++ b/0.6.x/js/01_core/13_XEventDispatcher.js @@ -1,26 +1,35 @@ -/* - *

EventDispatcher インスタンスのメンバ(_listeners)でイベントリスナをイベント名(string)やイベントID(5~以上の number, フレームワーク内で定義、5 以上になる理由は後述)をキーとする Array で記憶します。 - * Arrayには、__CallbackHash__ というハッシュ、または関数が蓄えられています。 +/** + *

EventDispatcher インスタンスのメンバ(_listeners)でイベントリスナをイベント名(string)や + * イベントID(5~以上の number, フレームワーク内で定義、5 以上になる理由は後述)をキーとする Array で記憶します。 + * + *

Arrayには、__CallbackHash__ というハッシュ、または関数が蓄えられています。 + * + *

また、イベントターゲット(EventDispatcher._rawObject)に渡された再利用可能クロージャの控えを _listeners[0] に記憶します。(ACTUAL_HANDLER) * - * また、dispatch 中の状態と操作を記録し不整合が起きないようにするためのプロパティを持ち、0 から 4 の番号が与えられています。 + *

dispatch 中の状態と操作を記録し不整合が起きないようにするためのプロパティ(_listeners[1]~_listeners[4])を持ちます。イベントID が 5 から始まるのはこのためです。 * *

*
0:ACTUAL_HANDLER *
イベントターゲットの addEventListener 等に渡される実際の関数(再利用可能クロージャ)を控えています。 *
1:DISPATCHING number - *
イベントディスパッチ中か?またディスパッチがネストした場合、その深さを記憶します。 + *
dispatch 中か?さらにインスタンス自身の dispatch がネストした場合、その深さを記憶します。 *
2:RESERVES Array - *
イベント発火中に listen() が呼ばれた場合に引数を蓄え、全てのディスパッチの完了時(_dispatching===0)に再度 listen() するための一時ストアです。 + *
イベント発火中に listen() が呼ばれた場合に引数を蓄え、完了時(DISPATCHING===0)に再度 listen() するための一時ストアです。 *
3:UNLISTENS Array - *
イベント発火中に unlisten() が呼ばれた場合に対象リスナを記憶し、リスナが呼ばれないようにします。全てのディスパッチの完了時(_dispatching===0)に再度 unlisten() します。 + *
イベント発火中に unlisten() が呼ばれた場合に対象リスナを記憶し、リスナが呼ばれないようにします。完了時(DISPATCHING===0)に再度 unlisten() します。 *
4:KILL_RESERVED boolean - *
イベント発火中に kill() が呼ばれた場合に、全てのディスパッチの完了時(_dispatching===0)に再度 kill() するためのフラグです。 + *
dispatch 中に kill() が呼ばれた場合に一旦 kill をキャンセルし、完了時(DISPATCHING===0)に再度 kill() するためのフラグです。 *
+ * + * @class __X_EventDispatcher_Listeners__ + * @private + * @abstract */ -var X_Listeners, - +var /** @enum {number} */ - X_Listeners_ = { + X_Listeners_ = + /** @lends __X_EventDispatcher_Listeners__ */ + { ACTUAL_HANDLER : 0, DISPATCHING : 1, RESERVES : 2, @@ -112,7 +121,7 @@ var EventDispatcher = X.EventDispatcher = * Arrayには、{k:種類,x:コンテキスト(thisObject),f:関数,s:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。 * * @private - * @type {X_Listeners} + * @type {__X_EventDispatcher_Listeners__} */ '_listeners' : null, @@ -207,8 +216,8 @@ var EventDispatcher = X.EventDispatcher = }, /** - * delay(ミリ秒)後にイベントを dispatch する。戻り値は uid = X.Timer.add() のタイマーID(数値)。X.Timer.remove(uid) でタイマーを解除して dispatch を中止できる。 - * kill() 時には内部でまだ呼ばれていないタイマーの X.Timer.remove() が行われる。 + * delay(ミリ秒)後にイベントを dispatch する。戻り値は uid = X.Timer.once() のタイマーID(数値)。X.Timer.remove(uid) でタイマーを解除して dispatch を中止できる。 + * kill() 時には内部でまだ呼ばれていないタイマーの X.Timer.remove() が行われる。インスタンスが破棄された後にタイマーが呼ばれることがないので神経質にならなくても安全に使える。 * @example this.asyncDispatch( 'myevent' ); * // どちらのコードも同じ動作をする。 * this.asyncDispatch( 0, 'myevent' ); @@ -289,7 +298,7 @@ function X_EventDispatcher_dispatch( e ){ if( r & X.Callback.STOP_NOW ){ sysOnly = true; }; - ret |= X.Type.isFinite( r ) ? r : 0; + ret |= X_Type_isFinite( r ) ? r : 0; }; if( ( --listeners[ X_Listeners_.DISPATCHING ] ) === 0 ){ @@ -389,7 +398,7 @@ function X_EventDispatcher_listen( type, opt_arg1, opt_arg2, opt_arg3 ){ return this; }; - if( X.Type.isArray( type ) ){ + if( X_Type_isArray( type ) ){ for( i = type.length; i; ){ this.listen( type[ --i ], opt_arg1, opt_arg2, opt_arg3 ); }; @@ -397,7 +406,7 @@ function X_EventDispatcher_listen( type, opt_arg1, opt_arg2, opt_arg3 ){ }; raw = this._rawObject || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ); - add = raw && ( !listeners || !listeners[ type ] ) && X.Type.isString( type ); + add = raw && ( !listeners || !listeners[ type ] ) && X_Type_isString( type ); if( this.listening( type, opt_arg1 || this, opt_arg2, opt_arg3 ) ) return this; @@ -439,7 +448,7 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){ list, reserves, unlistens, i, f, raw, k, empty; if( !listeners ) return this; - if( X.Type.isArray( opt_type ) ){ + if( X_Type_isArray( opt_type ) ){ for( i = opt_type.length; i; ){ this.unlisten( opt_type[ --i ], opt_arg1, opt_arg2, opt_arg3 ); if( !opt_type[ i ] ){ @@ -530,7 +539,7 @@ function X_EventDispatcher_addEvent( that, type, raw, list ){ var i; X_EventDispatcher_lock || ( type = X_Event_Rename[ type ] || type ); - if( X.Type.isArray( type ) ){ + if( X_Type_isArray( type ) ){ for( i = type.length; i; ){ X_EventDispatcher_systemListen( that, type[ --i ], X.emptyFunction ); console.log( 'events fix > ' + type[ i ] ); @@ -554,7 +563,7 @@ var X_EventDispatcher_actualAddEvent = break; case X_EventDispatcher_EVENT_TARGET_TYPE.XHR : - if( X_UA.Opera < 12 ){ + if( X_UA[ 'Opera' ] < 12 ){ // Opera11- の XHR は event オブジェクトが返らないため, eventType 毎に callback を指定する addEventListener もない raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] ); break; @@ -563,7 +572,7 @@ var X_EventDispatcher_actualAddEvent = default : // iOS と MacOSX Iron36 で発生。連続してアニメーションが起こると、クロージャの束縛された obj へのアクセスに失敗する。Win では起きない? // むしろ、MacOSX のブラウザ全般で起こる?? - if( ( X_UA.WebKit || X_UA.Blink ) && + if( ( X_UA[ 'WebKit' ] || X_UA[ 'Blink' ] ) && ( type === 'webkitTransitionEnd' || type === 'transitionend' || type === 'animationend' || type === 'webkitAnimationEnd' || type === 'animationstart' || type === 'webkitAnimationStart' || @@ -647,7 +656,7 @@ function X_EventDispatcher_removeEvent( that, type, raw, list, skip ){ var i; X_EventDispatcher_unlock || ( type = X_Event_Rename[ type ] || type ); - if( X.Type.isArray( type ) ){ + if( X_Type_isArray( type ) ){ for( i = type.length; i; ){ X_EventDispatcher_systemUnlisten( that, type[ --i ], X.emptyFunction ); }; @@ -668,7 +677,7 @@ var X_EventDispatcher_actualRemoveEvent = break; case X_EventDispatcher_EVENT_TARGET_TYPE.XHR : - if( X_UA.Opera < 12 ){ + if( X_UA[ 'Opera' ] < 12 ){ // Opera11- の XHR は event オブジェクトが返らないため, eventType 毎に callback を指定する addEventListener もない X_Callback_correct( raw[ 'on' + type ] ); raw[ 'on' + type ] = ''; @@ -676,7 +685,7 @@ var X_EventDispatcher_actualRemoveEvent = }; default : - if( ( X_UA.WebKit || X_UA.Blink ) && + if( ( X_UA[ 'WebKit' ] || X_UA[ 'Blink' ] ) && ( type === 'webkitTransitionEnd' || type === 'transitionend' || type === 'animationend' || type === 'webkitAnimationEnd' || type === 'animationstart' || type === 'webkitAnimationStart' || @@ -783,7 +792,7 @@ var X_EventDispatcher_actualHandleEvent = i, l; //console.log( '>>>>>>>>>> ' + e.type ); // touch event -> pointer - if( X.Type.isArray( ev ) ){ + if( X_Type_isArray( ev ) ){ if( ev.length === 0 ){ // TouchEvent の後に発生した MouseEvent のキャンセル ret = X.Callback.STOP_PROPAGATION | X.Callback.PREVENT_DEFAULT; @@ -803,7 +812,7 @@ var X_EventDispatcher_actualHandleEvent = if( ret & X.Callback.PREVENT_DEFAULT ){ this._tag === 'A' && this._rawObject.blur(); e.preventDefault(); - if( X_UA.WebKit < 525.13 ){ // Safari3- + if( X_UA[ 'WebKit' ] < 525.13 ){ // Safari3- if( e.type === 'click' || e.type === 'dbclick' ){ X_EventDispatcher_safariPreventDefault = true; }; @@ -812,7 +821,7 @@ var X_EventDispatcher_actualHandleEvent = }; }); -if( X_UA.WebKit < 525.13 ){ // Safari3- +if( X_UA[ 'WebKit' ] < 525.13 ){ // Safari3- document.documentElement.onclick = document.documentElement.ondbclick = function( e ){ if( X_EventDispatcher_safariPreventDefault ){