OSDN Git Service

Version 0.6.41, fix for Opera8 & NN7.2+.
[pettanr/clientJs.git] / 0.6.x / js / core / 03_XCallback.js
index cf4ffb9..0cc02ea 100644 (file)
@@ -5,13 +5,14 @@ X.Callback = {
        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
@@ -23,7 +24,7 @@ X.Callback = {
                } 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
@@ -63,55 +64,31 @@ X.Callback = {
                };\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
@@ -119,14 +96,29 @@ X.Callback = {
                        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
@@ -135,6 +127,10 @@ X.Callback = {
        _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
@@ -148,7 +144,7 @@ X.Callback = {
                        arg2     = arg1;\r
                };\r
                \r
-               if( arg2 && f.add && f.add !== arg2 ){\r
+               if( arg2 && f.add !== arg2 ){\r
                        return false;\r
                };\r
                \r
@@ -170,7 +166,6 @@ X.Callback = {
                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