OSDN Git Service

Fix the bug of X.NodeAnime.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 15_XEventDispatcher.js
index 34a5933..20701c3 100644 (file)
@@ -36,11 +36,8 @@ var X_LISTENERS_ACTUAL_HANDLER = 0,
 // ------------------------------------------------------------------------- //\r
 // ------------ local variables -------------------------------------------- //\r
 // ------------------------------------------------------------------------- //\r
-var /** @const */\r
-       X_EventDispatcher_EVENT_TARGET_OTHER        = 0,\r
-       /** @const */\r
+var X_EventDispatcher_EVENT_TARGET_OTHER        = 0,\r
        X_EventDispatcher_EVENT_TARGET_XHR          = 1,\r
-       /** @const */\r
        X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT = 2;\r
 \r
 var X_EventDispatcher_once         = false,\r
@@ -101,7 +98,9 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
                {\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
@@ -374,10 +373,6 @@ function X_EventDispatcher_dispatch( e ){
  * 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
@@ -427,13 +422,10 @@ function X_EventDispatcher_systemListen( that, type, opt_arg1, opt_arg2, opt_arg
 };\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
@@ -741,7 +733,9 @@ function X_EventDispatcher_actualRemoveEvent( that, type, raw, list, skip ){
 \r
 \r
 // TODO ブラウザからの呼び出しの最後に登録された関数を呼び出す機能(例えば画面の更新)\r
-var X_EventDispatcher_CURRENT_EVENTS = [];\r
+var X_EventDispatcher_CURRENT_EVENTS    = [];\r
+var X_EventDispatcher_ignoreActualEvent;\r
+var X_EventDispatcher_rawEvent;\r
 \r
 // handleEvent を拡張可能にするために、クロージャに移動した\r
 // Is this in regard to the Safari 1.x preventDefault bug on click/dblclick?\r
@@ -749,29 +743,54 @@ var X_EventDispatcher_CURRENT_EVENTS = [];
 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
-                               ev = new X_DomEvent( e, this, this[ '_rawObject' ] );\r
+                       var e   = event,\r
+                               elm = this[ '_rawObject' ],\r
+                               ev, ret;\r
                        \r
+                       if( X_EventDispatcher_ignoreActualEvent ){\r
+                               e.cancelBubble = true;\r
+                               return;\r
+                       };\r
+                       \r
+                       X_EventDispatcher_rawEvent = e;\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
+                       if( X_EventDispatcher_rawEvent === e ) X_EventDispatcher_rawEvent = null;\r
+\r
                        --X_EventDispatcher_CURRENT_EVENTS.length;\r
 \r
                        if( ret & X_CALLBACK_STOP_PROPAGATION ){\r
                                e.cancelBubble = true;\r
                        };\r
+                       \r
+                       if( !X_EventDispatcher_CURRENT_EVENTS.length ) ExecuteAtEnd_onEnd();\r
+                       \r
                        if( ret & X_CALLBACK_PREVENT_DEFAULT ){\r
-                               this[ '_tag' ] === 'A' && this[ '_rawObject' ].blur();\r
+                               X_EventDispatcher_ignoreActualEvent = true;\r
+                               this[ '_tag' ] === 'A' && elm.blur(); // おかしくない??\r
+                               X_EventDispatcher_ignoreActualEvent = false;\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
+                       var ret = X_CALLBACK_NONE,\r
+                               elm = this[ '_rawObject' ],\r
+                               ev, i, l;\r
                        \r
+                       if( X_EventDispatcher_ignoreActualEvent ){\r
+                               e.stopPropagation();\r
+                               return;\r
+                       };\r
+\r
+                       X_EventDispatcher_rawEvent = e;\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
@@ -789,13 +808,20 @@ var X_EventDispatcher_actualHandleEvent =
                                ret = this[ 'dispatch' ]( ev );\r
                        };\r
                        \r
+                       if( X_EventDispatcher_rawEvent === e ) X_EventDispatcher_rawEvent = null;\r
+                       \r
                        --X_EventDispatcher_CURRENT_EVENTS.length;\r
                        \r
+                       if( !X_EventDispatcher_CURRENT_EVENTS.length ) ExecuteAtEnd_onEnd();\r
+                       \r
                        if( ret & X_CALLBACK_STOP_PROPAGATION ){\r
                                e.stopPropagation();\r
                        };\r
                        if( ret & X_CALLBACK_PREVENT_DEFAULT ){\r
-                               this[ '_tag' ] === 'A' && this[ '_rawObject' ].blur();\r
+                               X_EventDispatcher_ignoreActualEvent = true;\r
+                               this[ '_tag' ] === 'A' && elm.blur();\r
+                               X_EventDispatcher_ignoreActualEvent = false;\r
+                               \r
                                e.preventDefault();\r
                                if( X_UA[ 'WebKit' ] < 525.13 ){ // Safari3-\r
                                        if( e.type === 'click' || e.type === 'dbclick' ){\r