* <dd>dispatch 中か?さらにインスタンス自身の dispatch がネストした場合、その深さを記憶します。\r
* <dt>2:RESERVES Array\r
* <dd>イベント発火中に listen() が呼ばれた場合に引数を蓄え、完了時(DISPATCHING===0)に再度 listen() するための一時ストアです。\r
- * <dt>3:UNLISTENS Array\r
+ * <dt>3:UNLISTENS Object\r
* <dd>イベント発火中に unlisten() が呼ばれた場合に対象リスナを記憶し、リスナが呼ばれないようにします。完了時(DISPATCHING===0)に再度 unlisten() します。\r
* <dt>4:KILL_RESERVED boolean\r
* <dd>dispatch 中に kill() が呼ばれた場合に一旦 kill をキャンセルし、完了時(DISPATCHING===0)に再度 kill() するためのフラグです。\r
*/\r
var X_Listeners_;\r
\r
-var /** @const */\r
- X_LISTENERS_ACTUAL_HANDLER = 0,\r
- /** @const */\r
+var X_LISTENERS_ACTUAL_HANDLER = 0,\r
X_LISTENERS_DISPATCHING = 1,\r
- /** @const */\r
X_LISTENERS_RESERVES = 2,\r
- /** @const */\r
X_LISTENERS_UNLISTENS = 3,\r
- /** @const */\r
X_LISTENERS_KILL_RESERVED = 4; // X.Event で、イベントIDを 5 から始めているので注意。\r
\r
\r
// ------------------------------------------------------------------------- //\r
// ------------ local variables -------------------------------------------- //\r
// ------------------------------------------------------------------------- //\r
+var X_EventDispatcher_EVENT_TARGET_OTHER = 0,\r
+ X_EventDispatcher_EVENT_TARGET_XHR = 1,\r
+ X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT = 2;\r
\r
-var X_EventDispatcher_once = false,\r
- X_EventDispatcher_lock = false,\r
- X_EventDispatcher_unlock = false,\r
- X_EventDispatcher_needsIndex = false,\r
+var X_EventDispatcher_once = false,\r
+ X_EventDispatcher_lock = false,\r
+ X_EventDispatcher_unlock = false,\r
+ X_EventDispatcher_needsIndex = false,\r
\r
X_EventDispatcher_safariPreventDefault = false, // Safari3-\r
+\r
+ X_EventDispatcher_LAZY_TIMERS = {},// Object.<number, X.EventDispatcher> number は timerID\r
\r
- /* @const */\r
- X_EventDispatcher_EVENT_TARGET_OTHER = 0,\r
- /* @const */\r
- X_EventDispatcher_EVENT_TARGET_XHR = 1,\r
- /* @const */\r
- X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT = 2,\r
- \r
- X_EventDispatcher_LAZY_TIMERS = {}; // Object.<number, X.EventDispatcher> number は timerID\r
+ // iOS と MacOSX Iron36 で発生。連続してアニメーションが起こると、クロージャの束縛された obj へのアクセスに失敗する。Win では起きない?\r
+ // むしろ、MacOSX のブラウザ全般で起こる??\r
+ X_EventDispatcher_ANIME_EVENTS = ( X_UA[ 'WebKit' ] || X_UA[ 'Blink' ] ) && {\r
+ 'transitionend' : true, 'webkitTransitionEnd' : true, 'mozTransitionEnd' : true, 'oTransitionEnd' : true, 'otransitionEnd' : true,\r
+ 'animationend' : true, 'webkitAnimationEnd' : true, 'oAnimationEnd' : true,\r
+ 'animationstart' : true, 'webkitAnimationStart' : true, 'oAnimationStart' : true,\r
+ 'animationiteration' : true, 'webkitAnimationIteration' : true, 'oAnimationIteration' : true\r
+ };\r
\r
// ------------------------------------------------------------------------- //\r
// --- interface ----------------------------------------------------------- //\r
{\r
\r
/**\r
- * OTHER(Node,window,document,Image,Audio), XHR, Silverlight\r
+ * EventDispatcher がラップしている EventTarget オブジェクトのタイプです。<br>\r
+ * X_EventDispatcher_actualAddEvent で使用されます。<br>\r
+ * OTHER:0(node,window,document,Image,Audio), XHR:1, Silverlight:2\r
* @private\r
* @type {number}\r
*/\r
\r
/**\r
* イベントリスナをイベント名文字列や数値(5以上、フレームワーク内で定義)をキーとするArrayで記憶します。<br>\r
- * Arrayには、{kind:種類,context:コンテキスト(thisObject),func:コールバック関数,supplement:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
+ * Arrayには、{cbKind:種類,context:コンテキスト(thisObject),func:コールバック関数,supplement:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
* \r
* @private\r
* @type {__Listeners__}\r
if( !listeners || !( list = listeners[ opt_type ] ) ) return false;\r
if( opt_arg1 === undefined ) return X_EventDispatcher_needsIndex ? 0 : true;\r
\r
- // TODO callbackHash か?判定が不十分!\r
- if( opt_arg1.kind ){\r
+ // TODO callbackHash か?判定が不十分! skipConvertion\r
+ if( opt_arg1.cbKind ){\r
cbHash = opt_arg1;\r
} else {\r
- cbHash = X_Callback_classifyCallbackArgs( opt_arg1, opt_arg2, opt_arg3, this );\r
+ cbHash = X_Closure_classifyCallbackArgs( opt_arg1, opt_arg2, opt_arg3, this );\r
};\r
\r
if( ( unlistens = listeners[ X_LISTENERS_UNLISTENS ] ) && ( unlistens = unlistens[ opt_type ] ) ){\r
for( i = unlistens.length; i; ){\r
f = unlistens[ --i ];\r
- if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.name === cbHash.name && f.supplement === cbHash.supplement && f.lock === lock ) ) return false;\r
+ if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.funcName === cbHash.funcName && f.supplement === cbHash.supplement && f.lock === lock ) ) return false;\r
};\r
};\r
+ \r
for( i = list.length; i; ){\r
f = list[ --i ];\r
- if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.name === cbHash.name && f.supplement === cbHash.supplement && f.lock === lock ) ){\r
+ if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.funcName === cbHash.funcName && f.supplement === cbHash.supplement && f.lock === lock ) ){\r
// index を要求された場合、lock されていない、または unlock なら index を返す\r
return X_EventDispatcher_needsIndex ? i : true;\r
};\r
e = delay;\r
delay = 0;\r
};\r
+ //{+dev\r
+ delay === undefined && eval( 'throw "asyncDispatch で undefined イベントが指定されました"' );\r
+ //}+dev\r
timerID = X_Timer_add( delay, 1, this, X_EventDispatcher_dispatch, [ e ] );\r
X_EventDispatcher_LAZY_TIMERS[ timerID ] = this;\r
return timerID;\r
*/\r
function X_EventDispatcher_dispatch( e ){\r
var listeners = this[ '_listeners' ],\r
- ret = X_Callback_NONE,\r
+ ret = X_CALLBACK_NONE,\r
type = e[ 'type' ],\r
list, unlistens, i, l, args, f, r, sysOnly, timerID, k;\r
\r
- if( !listeners || !( list = listeners[ type || e ] ) ) return X_Callback_NONE;\r
+ if( !listeners || !( list = listeners[ type || e ] ) ) return X_CALLBACK_NONE;\r
\r
// 数値, 文字が渡された場合\r
if( !type ){\r
} else {\r
listeners[ X_LISTENERS_DISPATCHING ] = 1;\r
};\r
- \r
- // todo:\r
- // type も保存\r
- listeners[ X_LISTENERS_UNLISTENS ] = listeners[ X_LISTENERS_UNLISTENS ] || {};\r
- unlistens = listeners[ X_LISTENERS_UNLISTENS ][ type ];\r
+\r
+ //listeners[ X_LISTENERS_UNLISTENS ] = listeners[ X_LISTENERS_UNLISTENS ] || {};\r
+ //unlistens = listeners[ X_LISTENERS_UNLISTENS ][ type ];\r
\r
for( i = 0; i < list.length; ++i ){\r
f = list[ i ];\r
+ // TODO removed フラグは?\r
+ if( f.removed ) continue;\r
+ /*\r
if( !unlistens ){\r
unlistens = listeners[ X_LISTENERS_UNLISTENS ][ type ];\r
};\r
if( unlistens && unlistens.indexOf( f ) !== -1 ) continue;\r
+ */\r
\r
- r = X_Callback_proxyCallback( f, args || ( args = [ e ] ) ) || 0;\r
+ r = X_Closure_proxyCallback( f, args || ( args = [ e ] ) );\r
\r
- if( f.once || r & X_Callback_UN_LISTEN ){\r
+ if( f.once || ( r & X_CALLBACK_UN_LISTEN ) ){\r
// dispatch 中に unlisten が作られることがある\r
if( !unlistens ){\r
unlistens = listeners[ X_LISTENERS_UNLISTENS ] || ( listeners[ X_LISTENERS_UNLISTENS ] = {} );\r
};\r
ret |= X_Type_isFinite( r ) ? r : 0;\r
\r
- if( ( r & X_Callback_STOP_NOW ) === X_Callback_STOP_NOW ){ // iOS では ( & ) 括弧が無いと判定を誤る\r
+ if( ( r & X_CALLBACK_STOP_NOW ) === X_CALLBACK_STOP_NOW ){ // iOS では ( & ) 括弧が無いと判定を誤る\r
sysOnly = true;\r
break;\r
};\r
* this[ 'listen' ]( [ 'open', 'close', 'ready' ], onUpdate );\r
* \r
* @alias EventDispatcher.prototype.listen\r
- * @param {string|number|Array.<string,number>} type 配列を指定した場合、複数のイベントタイプに対して同じコールバックを登録する。\r
- * @param {listener|function|Array} [opt_arg1=]\r
- * @param {function|Array} [opt_arg2=]\r
- * @param {Array} [opt_arg3=] コールバック時の引数を配列に入れる。引数がひとつでも配列を使用する。省略した場合引数なし。\r
* @return {EventDispatcher} チェインメソッド\r
*/\r
function X_EventDispatcher_listen( type, opt_arg1, opt_arg2, opt_arg3 ){\r
\r
add && X_EventDispatcher_actualAddEvent( this, type, raw, list );\r
\r
- f = X_Callback_classifyCallbackArgs( opt_arg1, opt_arg2, opt_arg3, this );\r
+ f = X_Closure_classifyCallbackArgs( opt_arg1, opt_arg2, opt_arg3, this );\r
list[ list.length ] = f;\r
f.once = X_EventDispatcher_once;\r
f.lock = X_EventDispatcher_lock;\r
};\r
\r
/**\r
- * イベントリスナの解除を行う。登録時と同じ引数を与える必要がある。kill() ですべてのイベントが解除されるので、途中で解除されるイベント以外は kill() に任せてしまってよい。\r
+ * イベントリスナの解除を行う。登録時と同じ引数を与える必要がある。kill() で自信に登録されたすべてのイベントが解除されるので、途中で解除されるイベント以外は kill() に任せてしまってよい。<br>\r
+ * 他人に登録したイベントを解除せずに kill するのは NG。\r
* @alias EventDispatcher.prototype.unlisten\r
* @return {EventDispatcher}\r
- * @param {string|number|Array.<string,number>} opt_type イベントID, イベント名、またはその配列\r
- * @param {listener|function|Array} opt_arg1\r
- * @param {function|Array} opt_arg2\r
- * @param {Array} opt_arg3\r
*/\r
function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){\r
var listeners = this[ '_listeners' ],\r
\r
f = ( list = listeners[ opt_type ] )[ i ];\r
\r
- if( unlistens = listeners[ X_LISTENERS_UNLISTENS ] ){\r
+ if( listeners[ X_LISTENERS_DISPATCHING ] ){\r
+ unlistens = listeners[ X_LISTENERS_UNLISTENS ] || ( listeners[ X_LISTENERS_UNLISTENS ] = {} );\r
// _unlistens に入っている callbackHash は、lock のチェックは済んでいる\r
( unlistens = unlistens[ opt_type ] ) ?\r
( unlistens[ unlistens.length ] = f ) :\r
( listeners[ X_LISTENERS_UNLISTENS ][ opt_type ] = [ f ] );\r
+ f.removed = true;\r
} else {\r
- delete f.once;\r
+ //delete f.once;\r
+ X_Object_clear( f );\r
+ \r
if( list.length !== 1 ){\r
list.splice( i, 1 );\r
} else {\r
\r
function X_EventDispatcher_actualAddEvent( that, type, raw, list ){\r
var i, f;\r
+\r
X_EventDispatcher_lock || ( type = X_Event_Rename[ type ] || type );\r
\r
if( X_Type_isArray( type ) ){\r
if( X_UA_EVENT.W3C ){\r
switch( that[ '_rawType' ] ){\r
case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
- list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
+ list.slcallback = X_Closure_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
list.sltoken = raw[ 'AddEventListener' ]( type, list.slcallback );\r
break;\r
\r
case X_EventDispatcher_EVENT_TARGET_XHR :\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
+ raw[ 'on' + type ] = X_Closure_create( that, X_EventDispatcher_dispatch, [ type ] );\r
break;\r
};\r
\r
default :\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
+ if( X_EventDispatcher_ANIME_EVENTS && X_EventDispatcher_ANIME_EVENTS[ type ] ){\r
raw.addEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
} else {\r
- f = that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] || ( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
+ f = that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] || ( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] = X_Closure_create( that, X_EventDispatcher_actualHandleEvent ) );\r
\r
if( raw.addEventListener ){\r
raw.addEventListener( type, f, false );\r
if( X_UA_EVENT.IE ){\r
switch( that[ '_rawType' ] ){ \r
case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
- list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
+ list.slcallback = X_Closure_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
list.sltoken = raw[ 'AddEventListener' ]( type, list.slcallback );\r
break; \r
\r
case X_EventDispatcher_EVENT_TARGET_XHR :\r
console.log( 'XHR addEvent ' + type );\r
// ie8- の XHR は window.event が更新されないため, eventType 毎に callback を指定する\r
- raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
+ raw[ 'on' + type ] = X_Closure_create( that, X_EventDispatcher_dispatch, [ type ] );\r
break;\r
\r
default :\r
- f = that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] || ( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
+ f = that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] || ( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] = X_Closure_create( that, X_EventDispatcher_actualHandleEvent ) );\r
\r
if( raw.attachEvent ){\r
raw.attachEvent( 'on' + type, f );\r
switch( that[ '_rawType' ] ){\r
case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
// DOM0 で Silverlight ってあるの -> ie4 mobile?\r
- list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
+ list.slcallback = X_Closure_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
list.sltoken = raw[ 'AddEventListener' ]( type, list.slcallback );\r
break; \r
\r
case X_EventDispatcher_EVENT_TARGET_XHR :\r
// ie4 mobile は XHR をサポート!\r
- raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
+ raw[ 'on' + type ] = X_Closure_create( that, X_EventDispatcher_dispatch, [ type ] );\r
break;\r
\r
default :\r
- raw[ 'on' + type ] = that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] || ( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
+ raw[ 'on' + type ] = that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] || ( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] = X_Closure_create( that, X_EventDispatcher_actualHandleEvent ) );\r
break;\r
};\r
}\r
\r
/*\r
* iOS の webkitTransitionEnd が連続して起こる場合、\r
- * コールバックの(that[ X_LISTENERS_ACTUAL_HANDLER ])クロージャ内の実際のコールバック(X_Callback_actualClosure:obj._)が\r
+ * コールバックの(that[ X_LISTENERS_ACTUAL_HANDLER ])クロージャ内の実際のコールバック(X_Closure_actualClosure:obj._)が\r
* 参照できていない問題に遭遇、、、iOS3.1.3 & iOS6.1.5 で確認\r
* animation も怪しい、、、\r
*/\r
\r
function X_EventDispatcher_actualRemoveEvent( that, type, raw, list, skip ){\r
var i;\r
+\r
X_EventDispatcher_unlock || ( type = X_Event_Rename[ type ] || type );\r
\r
if( X_Type_isArray( type ) ){\r
switch( that[ '_rawType' ] ){\r
case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
raw[ 'RemoveEventListener' ]( type, list.sltoken ); // token\r
- X_Callback_correct( list.slcallback );\r
+ X_Closure_correct( list.slcallback );\r
delete list.sltoken;\r
delete list.slcallback;\r
break;\r
case X_EventDispatcher_EVENT_TARGET_XHR :\r
if( X_UA[ 'Opera' ] < 12 ){\r
// Opera11- の XHR は event オブジェクトが返らないため, eventType 毎に callback を指定する addEventListener もない\r
- X_Callback_correct( raw[ 'on' + type ] );\r
+ X_Closure_correct( raw[ 'on' + type ] );\r
raw[ 'on' + type ] = '';\r
break;\r
};\r
\r
default :\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
+ if( X_EventDispatcher_ANIME_EVENTS && X_EventDispatcher_ANIME_EVENTS[ type ] ){\r
raw.removeEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
- } else \r
+ } else\r
if( raw.addEventListener ){\r
raw.removeEventListener( type, that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ], false );\r
} else {\r
};\r
\r
if( !skip && that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] ){\r
- X_Callback_correct( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] );\r
+ X_Closure_correct( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] );\r
delete that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ];\r
};\r
};\r
switch( that[ '_rawType' ] ){\r
case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
raw[ 'RemoveEventListener' ]( type, list.sltoken ); // token\r
- X_Callback_correct( list.slcallback );\r
+ X_Closure_correct( list.slcallback );\r
delete list.sltoken;\r
delete list.slcallback;\r
break;\r
\r
case X_EventDispatcher_EVENT_TARGET_XHR :\r
- X_Callback_correct( raw[ 'on' + type ] );\r
+ X_Closure_correct( raw[ 'on' + type ] );\r
raw[ 'on' + type ] = X_emptyFunction;\r
raw[ 'on' + type ] = '';\r
console.log( 'XHR rmEvent ' + type );\r
};\r
\r
if( !skip ){\r
- X_Callback_correct( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] );\r
+ X_Closure_correct( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] );\r
delete that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ];\r
};\r
};\r
switch( that[ '_rawType' ] ){\r
case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
raw[ 'RemoveEventListener' ]( type, list.sltoken ); // token\r
- X_Callback_correct( list.slcallback );\r
+ X_Closure_correct( list.slcallback );\r
delete list.sltoken;\r
delete list.slcallback;\r
break;\r
\r
case X_EventDispatcher_EVENT_TARGET_XHR :\r
- X_Callback_correct( raw[ 'on' + type ] );\r
+ X_Closure_correct( raw[ 'on' + type ] );\r
raw[ 'on' + type ] = X_emptyFunction;\r
raw[ 'on' + type ] = '';\r
break;\r
raw[ 'on' + type ] = '';\r
\r
if( !skip ){\r
- X_Callback_correct( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] );\r
+ X_Closure_correct( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] );\r
delete that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ];\r
};\r
};\r
\r
\r
// TODO ブラウザからの呼び出しの最後に登録された関数を呼び出す機能(例えば画面の更新)\r
+var X_EventDispatcher_CURRENT_EVENTS = [];\r
+var X_EventDispatcher_ignoreActualEvent = '';\r
\r
// handleEvent を拡張可能にするために、クロージャに移動した\r
// Is this in regard to the Safari 1.x preventDefault bug on click/dblclick?\r
var X_EventDispatcher_actualHandleEvent =\r
X_UA_EVENT.IE4 || X_UA_EVENT.IE ? // ie45678 EVENT_IE & EVENT_DOM0 for ie4\r
(function(){\r
- var e = event, ret;\r
+ var e = event,\r
+ elm = this[ '_rawObject' ],\r
+ ev, ret;\r
\r
- ret = this[ 'dispatch' ]( new X_DomEvent( e, this, this[ '_rawObject' ] ) );\r
+ /* if( e.type === X_EventDispatcher_ignoreActualEvent ){\r
+ e.cancelBubble = true;\r
+ return;\r
+ }; */\r
+ \r
+ ev = new X_DomEvent( e, this, elm );\r
+ \r
+ X_EventDispatcher_CURRENT_EVENTS[ X_EventDispatcher_CURRENT_EVENTS.length ] = ev;\r
+ \r
+ ret = this[ 'dispatch' ]( ev );\r
+\r
+ --X_EventDispatcher_CURRENT_EVENTS.length;\r
\r
- if( ret & X_Callback_STOP_PROPAGATION ){\r
+ if( ret & X_CALLBACK_STOP_PROPAGATION ){\r
e.cancelBubble = true;\r
};\r
- if( ret & X_Callback_PREVENT_DEFAULT ){\r
- this[ '_tag' ] === 'A' && this[ '_rawObject' ].blur();\r
+ if( ret & X_CALLBACK_PREVENT_DEFAULT ){\r
+ this[ '_tag' ] === 'A' && elm.blur();\r
return e.returnValue = false;\r
};\r
}) :\r
//X_UA_EVENT.W3C || X_UA_EVENT.DOM0\r
(function( e ){\r
- var ev = new X_DomEvent( e, this ),\r
- ret = X_Callback_NONE,\r
- i, l;\r
- //console.log( '>>>>>>>>>> ' + e.type );\r
+ var ret = X_CALLBACK_NONE,\r
+ ev, i, l;\r
+ \r
+ /* if( e.type === X_EventDispatcher_ignoreActualEvent ){\r
+ e.stopPropagation();\r
+ return;\r
+ }; */\r
+ \r
+ ev = new X_DomEvent( e, this );\r
+ X_EventDispatcher_CURRENT_EVENTS[ X_EventDispatcher_CURRENT_EVENTS.length ] = ev;\r
+\r
// touch event -> pointer\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
+ ret = X_CALLBACK_STOP_PROPAGATION | X_CALLBACK_PREVENT_DEFAULT;\r
} else {\r
for( i = 0, l = ev.length; i < l; ++i ){\r
//console.log( 'handleEvent ' + ev[ i ].type );\r
ret = this[ 'dispatch' ]( ev );\r
};\r
\r
- if( ret & X_Callback_STOP_PROPAGATION ){\r
+ --X_EventDispatcher_CURRENT_EVENTS.length;\r
+ \r
+ if( ret & X_CALLBACK_STOP_PROPAGATION ){\r
e.stopPropagation();\r
};\r
- if( ret & 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