NONE : 0,\r
UN_LISTEN : 1,\r
STOP_PROPAGATION : 2, // 上位階層への伝播のキャンセル\r
- STOP_NOW : 4, // 同一階層のリスナーのキャンセル\r
+ STOP_NOW : 4 | 2, // 同一階層のリスナーのキャンセル(上位へもキャンセル)\r
PREVENT_DEFAULT : 8, // 結果動作のキャンセル,\r
MONOPOLY : 16, // move event を独占する\r
- SYS_CANCEL : 32,\r
+ SYS_CANCEL : 32 | 4 | 2,\r
+ \r
+ _LIVE_LIST : [],\r
+ _POOL_LIST : [],\r
\r
- _LIVE_LIST : [],\r
- _POOL_LIST : [],\r
create : function( arg0, arg1, arg2 /* [ listener || ( context + function ) || function ][ args... ] */ ){\r
var self = X.Callback,\r
live = self._LIVE_LIST,\r
} else\r
if( typeof arg0 === 'function' ){\r
callback = arg0;\r
- arg2 = arg1;\r
+ if( !( arg2 = arg1 ) ) return callback; // function のみの場合 callback オブジェクトを作らない\r
} else\r
if( arg0 && typeof arg0.handleEvent === 'function' ){\r
listener = arg0;\r
};\r
return f;\r
},\r
- once : function( arg0, arg1, arg2 ){\r
- var f = X.Callback.create( arg0, arg1, arg2 );\r
- f.once = true;\r
- return f;\r
- },\r
- find : function( arg0, arg1 /* [ listener || ( context + function ) || function ] */ ){\r
- var live = X.Callback._LIVE_LIST,\r
- i = live.length,\r
- listener, context, callback,\r
- f;\r
- if( typeof arg1 === 'function' ){\r
- context = arg0;\r
- callback = arg1;\r
- } else\r
- if( typeof arg0 === 'function' ){\r
- callback = arg0;\r
- } else\r
- if( arg0 && typeof arg0.handleEvent === 'function' ){\r
- listener = arg0;\r
- };\r
- \r
- for( ; i; ){\r
- f = live[ --i ];\r
- if( listener && f.listener === listener ){\r
- return f;\r
- } else\r
- if( context && f.context === context && f.callback === callback ){\r
- return f;\r
- } else \r
- if( f.callback === callback ){\r
- return f;\r
- };\r
- };\r
- return null;\r
- },\r
_contextCallback : function(){\r
var f = this,\r
a = f.a,\r
s = f.add,\r
c = f.callback,\r
x = f.context,\r
- i = 0, l, r;\r
- s && s.push.apply( a, s );\r
- l = a.length;\r
- r = l === 0 ? c.call( x ) :\r
- l === 1 ? c.call( x, a[ 0 ] ) : c.apply( x, a );\r
+ i = 0,\r
+ ary, r;\r
+ //s && s.push.apply( a, s );\r
+ if( s && s.length ){\r
+ ary = [];\r
+ a.length &&\r
+ (\r
+ a.length === 1 ?\r
+ ( ary[ 0 ] = a[ 0 ] ) :\r
+ ary.push.apply( ary, a )\r
+ );\r
+ s.length === 1 ?\r
+ ( ary[ ary.length ] = s[ 0 ] ) :\r
+ ary.push.apply( ary, s );\r
+ a = ary;\r
+ };\r
+ r = a.length === 0 ? c.call( x ) : c.apply( x, a );\r
delete f.a;\r
//delete f.t;\r
- f.once && X.Callback._correct( f );\r
return r;\r
},\r
_generalCallback : function(){\r
a = f.a,\r
s = f.add,\r
c = f.callback,\r
- i = 0, l, r;\r
- s && s.push.apply( a, s );\r
- l = a.length;\r
- r = l === 0 ? c() :\r
- l === 1 ? c( a[ 0 ] ) : c.apply( null, a );\r
+ i = 0,\r
+ ary, r;\r
+ //s && s.push.apply( a, s );\r
+ if( s && s.length ){\r
+ ary = [];\r
+ a.length &&\r
+ (\r
+ a.length === 1 ?\r
+ ( ary[ 0 ] = a[ 0 ] ) :\r
+ ary.push.apply( ary, a )\r
+ );\r
+ s.length === 1 ?\r
+ ( ary[ ary.length ] = s[ 0 ] ) :\r
+ ary.push.apply( ary, s );\r
+ a = ary;\r
+ };\r
+ r = a.length === 0 ?\r
+ c() :\r
+ a.length === 1 ?\r
+ c( a[ 0 ] ) :\r
+ c.apply( null, a );\r
delete f.a;\r
//delete f.t;\r
- f.once && X.Callback._correct( f );\r
return r;\r
},\r
_kill : function(){\r
_same : function( arg0, arg1, arg2 ){\r
var listener, context, callback,\r
f = this;\r
+ \r
+ if( arg0.kill === X.Callback._kill ){ // arg0 === X.Callback toString() で判定は?\r
+ return this === arg0;\r
+ } else\r
if( typeof arg1 === 'function' ){\r
context = arg0;\r
callback = arg1;\r
arg2 = arg1;\r
};\r
\r
- if( arg2 && f.add && f.add !== arg2 ){\r
+ if( arg2 && f.add !== arg2 ){\r
return false;\r
};\r
\r
if( f.listener ) delete f.listener;\r
if( f.context ) delete f.context;\r
if( f.callback ) delete f.callback;\r
- if( f.once ) delete f.once;\r
if( f.add ) delete f.add;\r
if( i === -1 ) return;\r
self._LIVE_LIST.splice( i, 1 );\r