10 _dispatching : 0, // dispatch 中の unlisten で使用
\r
11 _unlistens : null, // dispatch 中の unlisten で使用
\r
12 _needsIndex : false, // listening で index を返す
\r
13 _killReserved : false,
\r
15 listen : function( type, arg1, arg2, arg3 ){
\r
16 var list = this._listeners,
\r
18 if( this.listening( type, arg1, arg2, arg3 ) ) return this;
\r
19 if( !list ) list = this._listeners = {};
\r
20 if( !( list = list[ type ] ) ) list = this._listeners[ type ] = [];
\r
21 list[ list.length ] = f =
\r
24 X.Callback.create( arg1, arg2, arg3 );
\r
25 f.once = X.EventDispatcher._once;
\r
28 listenOnce : function( type, arg1, arg2, arg3 ){
\r
29 X.EventDispatcher._once = true;
\r
30 this.listen( type, arg1, arg2, arg3 );
\r
31 X.EventDispatcher._once = false;
\r
34 unlisten : function( type, arg1, arg2, arg3 ){
\r
35 var list = this._listeners,
\r
37 if( !list ) return this;
\r
38 if( type === undefined ){
\r
40 for( type in list ){
\r
41 this.unlisten( type ); // override されていることがあるので、必ず unlisten を使用
\r
45 if( arg1 === undefined ){
\r
47 if( !( list = list[ type ] ) ) return this;
\r
48 for( i = list.length; i; ){
\r
49 this.unisten( type, list[ --i ] ); // override されていることがあるので、必ず unlisten を使用
\r
54 this._needsIndex = true;
\r
55 i = this.listening( type, arg1, arg2, arg3 );
\r
56 delete this._needsIndex;
\r
57 if( i === false ) return this;
\r
59 f = ( list = list[ type ] )[ i ];
\r
60 if( this._dispatching ){
\r
61 this._unlistens[ this._unlistens.length ] = f;
\r
64 f.kill === X.Callback._kill && f.kill();
\r
65 list.splice( i, 1 );
\r
67 delete this._listeners[ type ];
\r
68 if( X.isEmptyObject( this._listeners ) ) delete this._listeners;
\r
73 listening : function( type, arg1, arg2, arg3 ){
\r
74 var list = this._listeners, i, f;
\r
75 if( type === undefined ) return !!list;
\r
76 if( !list || !( list = list[ type ] ) ) return false;
\r
77 if( arg1 === undefined ) return true;
\r
78 for( i = list.length; i; ){
\r
80 if( f === arg1 || ( f.same && f.same( arg1, arg2, arg3 ) ) ) return this._needsIndex ? i : true;
\r
85 * dispatch 中に dispatch が呼ばれるケースがあるため、
\r
86 * _dispatching では その深さを保存する
\r
87 * _dispatching が 0 のときに unlistens を削除する
\r
90 dispatch : function( e ){
\r
91 // dispatch 中の listen は?
\r
92 var list = this._listeners,
\r
93 ret = X.Callback.NONE,
\r
96 if( !list || !( list = list[ e.type ] ) ) return ret;
\r
98 ++this._dispatching;
\r
99 this._unlistens = this._unlistens || [];
\r
101 for( i = 0; i < list.length; ++i ){
\r
103 if( this._unlistens.length && this._unlistens.indexOf( f ) !== -1 ){
\r
107 r = typeof f === 'function' ? f( e ) : f.handleEvent( e );
\r
109 if( f.once === true || r & X.Callback.UN_LISTEN ){
\r
110 this._unlistens[ this._unlistens.length ] = f;
\r
113 if( r & X.Callback.STOP_NOW ){
\r
119 if( ( --this._dispatching ) === 0 ){
\r
120 // dispatch 中に unlisten された要素の削除
\r
121 for( i = this._unlistens.length ; i; ){
\r
122 this.unlisten( e.type, this._unlistens[ --i ] );
\r
124 delete this._dispatching;
\r
125 delete this._unlistens;
\r
127 this._killReserved && this.kill();
\r
133 onKill : function(){
\r
134 if( this._dispatching ){
\r
135 this._killReserved = true;
\r
138 this._listeners && this.unlisten();
\r
141 asyncDispatch : function( delay, e ){
\r
142 return X.Timer.once( delay, this, this.dispatch, [ e ] );
\r
147 X.EventDispatcher._once = false;
\r