OSDN Git Service

Version 0.6.110, Super & superCall.
authoritozyun <itozyun@user.sourceforge.jp>
Tue, 28 Oct 2014 16:37:16 +0000 (01:37 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Tue, 28 Oct 2014 16:37:16 +0000 (01:37 +0900)
0.6.x/js/01_core/03_XType.js
0.6.x/js/01_core/04_XObject.js
0.6.x/js/01_core/11_XClass.js
0.6.x/js/01_core/12_XEvent.js
0.6.x/js/01_core/13_XEventDispatcher.js
0.6.x/js/02_dom/10_XNodeAnime.js

index acc1b42..212a803 100644 (file)
@@ -19,7 +19,7 @@ X.Type = {
        \r
        isArray :\r
                new Function( 'v',\r
-                       X_UA.IE < 5.5 ?\r
+                       X_UA.IE < 5.5 || X_UA.NetFront < 4 ? // netfront3.4 は html に  instanceof をすると error になる\r
                                'return v&&v.push===Array.prototype.push' : // win ie5-, MacIE5.2\r
                        X_UA.IE ?\r
                                'return v&&Object.prototype.toString.call(v)==="[object Array]"' :\r
@@ -51,7 +51,7 @@ X.Type = {
                        ( X_UA.IE4 || X_UA.MacIE ) ?\r
                                'return v&&v.tagName&&v.insertAdjacentHTML&&true' : // ie4 or MacIE5.23, v.all <- error\r
                        X_UA.NetFront < 4 ?\r
-                               'return v&&v.nodeType===1' : // instanceof not a function.                      \r
+                               'return v&&v.nodeType===1' : // instanceof not a function.              \r
                        window[ 'HTMLElement' ] ?\r
                                'return v instanceof HTMLElement' :\r
                        //window[ 'Element' ] ?\r
index 8c8b82e..60db866 100644 (file)
@@ -2,7 +2,7 @@
 var X_Object_inObject = X_UA.IE < 5.5 ? // TODO JScript で判定\r
        (function( name, obj ){\r
                var p;\r
-               if( obj[ name ] ) return true;\r
+               if( obj[ name ] ) return true; // quick\r
                name += ''; // 数値も許可\r
                for( p in obj ){\r
                        if( p === name ) return true;\r
@@ -13,9 +13,10 @@ var X_Object_inObject = X_UA.IE < 5.5 ? // TODO JScript で判定
 \r
 \r
 X.Object = {\r
-       \r
        clone      : X_Object_clone,\r
        \r
+       override   : X_Object_override,\r
+       \r
        deepCopy   : X_Object_deepCopy,\r
        \r
        cloneArray : X_Object_cloneArray,\r
@@ -35,6 +36,15 @@ function X_Object_clone( src ){
        return ret;\r
 };\r
 \r
+function X_Object_override( target, src ){\r
+       var k;\r
+       if( !X.Type.isObject( src ) ) return target;\r
+       for( k in src ){\r
+               target[ k ] = src[ k ];\r
+       };\r
+       return target;\r
+};\r
+\r
 function X_Object_deepCopy( src ){             \r
        return X_Object_deepCopy_( src, [], [], -1 );\r
 };\r
index 5222ea8..e32406c 100644 (file)
@@ -34,6 +34,7 @@ X_Class_CommonProps =
 {\r
        /*\r
         * インスタンスの破棄。\r
+        * TODO kill したインスタンスのイベントが残っていないか?これは開発用のみ\r
         */\r
        kill : function(){\r
                var instance = this,\r
@@ -96,9 +97,97 @@ X_Class_CommonProps =
                };\r
        },\r
        \r
-       // TODO Super\r
-       // superCall\r
+       /*  クラス定義を辿ってスーパークラスのコンストラクタを探す。\r
+        *  呼び出したコンストラクタは配列に控える。\r
+        *  さらに呼ばれた場合、配列を元にさらに奥のコンストラクタを取得\r
+        *  TODO 現在 new しているインスタンスを保持してチェックする\r
+        */\r
+       Super : function(){\r
+               var sClass = this,\r
+                       i      = X_Class_CALLING_SUPER.indexOf( sClass ),\r
+                       n      = -1,\r
+                       l, sList, def, sConst, ret;\r
+       \r
+               if( i === -1 ){\r
+                       X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass;\r
+                       X_Class_CALL_SUPER_STACK[ l ] = sList = [];\r
+               } else {\r
+                       sList = X_Class_CALL_SUPER_STACK[ i ];\r
+               };\r
+               \r
+               while( sClass ){\r
+                       def    = X_Class_getClassDef( sClass );\r
+                       sClass = def.SuperClass;\r
+                       sConst = def.SuperConstructor;\r
+                       if( sConst && sList[ ++n ] !== sConst ){\r
+                               sList[ n ] = sConst;\r
+                               ret = sConst.apply( this, arguments );\r
+                               --sList.length;\r
+                               if( !sList.length ){\r
+                                       X_Class_CALLING_SUPER.splice( i, 1 );\r
+                                       X_Class_CALL_SUPER_STACK.splice( i, 1 );\r
+                               };\r
+                               return ret;\r
+                       };\r
+               };\r
+               console.log( 'スーパークラスのコンストラクタが見つかいません' );\r
+       },\r
+\r
+       /*\r
+        * func について、親クラスで設定されている同名の関数メンバーを呼び出す\r
+        * 2つ以上の異なる名前で同じ関数がメンバーだった場合、失敗します\r
+        * 例) this.superCall( arguments.callee, param0, param1, ... )\r
+        */\r
+       superCall : function( func /* ...args */ ){\r
+               var sClass = this,\r
+                       args   = arguments,\r
+                       name, p, sFunc, hit = false;\r
+               if( X.Type.isFunction( func ) ){\r
+                       for( p in this ){\r
+                               if( this[ p ] === func ){\r
+                                       name = p;\r
+                                       break;\r
+                               };\r
+                       };\r
+                       if( !name ) return;\r
+               } else {\r
+                       return;\r
+               };\r
+               \r
+               if( X_EMPTY_OBJECT[ name ] ) return;\r
+               \r
+               while( sClass ){\r
+                       def    = X_Class_getClassDef( sClass );\r
+                       sClass = def.SuperClass;\r
+                       sFunc  = sClass.prototype[ name ];\r
+                       if( sFunc === func ){\r
+                               hit = true; // 現在の関数にヒット\r
+                       } else\r
+                       if( hit && X_Object_inObject( name, this ) ){\r
+                               if( X.Type.isFunction( sFunc ) ){\r
+                                       switch( args.length ){\r
+                                               case 1 :\r
+                                                       return sFunc.call( this );\r
+                                               case 2 :\r
+                                                       return sFunc.call( this, args[ 1 ] );\r
+                                               case 3 :\r
+                                                       return sFunc.call( this, args[ 1 ], args[ 2 ] );\r
+                                               case 4 :\r
+                                                       return sFunc.call( this, args[ 1 ], args[ 2 ], args[ 3 ] );\r
+                                               default :\r
+                                                       args = X.Object.cloneArray( args );\r
+                                                       args.shift();\r
+                                                       return sFunc.apply( this, args );\r
+                                       };\r
+                               };\r
+                               break;\r
+                       };\r
+               };\r
+       },\r
        \r
+       /*\r
+        * TODO instanceof に対応したブラウザはそちらを使用\r
+        */\r
        instanceOf : function( klass ){\r
                var Super = this;\r
                if( this.constructor === klass ) return true;\r
@@ -108,6 +197,8 @@ X_Class_CommonProps =
                return false;\r
        }\r
 };\r
+\r
+\r
 // ------------------------------------------------------------------------- //\r
 // --- interface ----------------------------------------------------------- //\r
 // ------------------------------------------------------------------------- //\r
@@ -318,8 +409,8 @@ function X_Class_getPrivate( instance ){
 function X_Class_override( target, src, force ){\r
        var p;\r
        for( p in src ){\r
-               if( p === 'Super' || p === 'SuperConstructor' || p === '__proto__' || p === 'prototype' || p === 'constructor' ){\r
-                       X.Logger.critical( 'Super & SuperConstructor is reserved!' );\r
+               if( p === '__proto__' || p === 'prototype' || p === 'constructor' ){\r
+                       X.Logger.critical( p + ' is reserved!' );\r
                        return;\r
                };\r
                if( force || target[ p ] === void 0 ){\r
@@ -358,7 +449,7 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
                superDef    = X_Class_getClassDef( Super ),\r
                displayName = args[ 0 ],\r
                classSetting,\r
-               opt_super,\r
+               //opt_super,\r
                klass, def;\r
        if( superDef.Final ) X.Logger.critical( 'X.Class inherits, Class is final!' );\r
        \r
@@ -379,7 +470,7 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
                classSetting = superDef.setting;// &= ~X.Class.ABSTRACT;\r
        };\r
        if( superDef.isPrivate ) classSetting = classSetting | X.Class.PRIVATE_DATA;\r
-       opt_super = !!( classSetting & X.Class.SUPER_ACCESS );\r
+       //opt_super = !!( classSetting & X.Class.SUPER_ACCESS );\r
        params.push( classSetting );\r
 \r
        // サブクラスのシャドウ\r
@@ -389,7 +480,9 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
        if( superDef.privateClass ){\r
                params.push( superDef.privateClass );\r
        };\r
-       params.push( args[ 0 ] ); /* props サブクラスでは未定義でも可 */\r
+       \r
+       /* props 未定義でも可 */\r
+       params.push( args[ 0 ] );\r
        \r
        // 継承クラスの作成\r
        if( X_Class_useObjectCreate ){\r
@@ -398,23 +491,21 @@ function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props
        if( X_Class_use_proto_ ){\r
                X_Class_traits = Super.prototype;\r
        } else {\r
-               //Super.__new = null;\r
                X_Class_traits = new Super( X_Closure_COMMAND_DROP );\r
-               //Super.__new = X_Class_actualConstructor;                      \r
        };\r
        klass  = X.Class.create.apply( X.Class, params );\r
        X_Class_traits = null;\r
        \r
        def    = X_Class_getClassDef( klass );\r
        // 継承用プロパティを控える\r
-       if( opt_super === true ){\r
-               def.superAccess = true;\r
+       //if( opt_super === true ){\r
+               //def.superAccess = true;\r
                def.SuperClass  = Super;\r
                def.SuperProto  = Super.prototype;\r
                def.SuperConstructor = superDef.Constructor || superDef.SuperConstructor;\r
-       } else {\r
-               def.SuperClass = Super; // instanceOf() で親クラスを調べる!\r
-       };\r
+       // else {\r
+       //      def.SuperClass = Super; // instanceOf() で親クラスを調べる!\r
+       //};\r
        \r
        return klass;\r
 };\r
@@ -437,13 +528,12 @@ function X_Class_actualConstructor( obj, args ){
                X.Logger.critical( 'use myClass.newPrivate( instance, ...args )!' );\r
                return;\r
        };\r
-       //klass.__new = null;\r
+       \r
        instance = def.pool && def.pool.length > 0 ?\r
                                        def.pool.pop() :\r
                                X_Class_useObjectCreate ?\r
                                        Object.create( klass.prototype ) :\r
                                        new klass( X_Closure_COMMAND_DROP );\r
-       //klass.__new = X_Class_actualConstructor;\r
        \r
        if( def.isPrivate ){\r
                userDef = X_Class_getClassDef( dataUser );\r
@@ -454,11 +544,11 @@ function X_Class_actualConstructor( obj, args ){
        } else {\r
                def.live && def.live.push( instance );\r
        };\r
-       if( def.superAccess ){\r
+       //if( def.superAccess ){\r
                // TODO klass.prototype に移動\r
-               instance.Super = def.SuperProto;\r
-               instance.SuperConstructor = X_Class_superConstructor;\r
-       };\r
+               //instance.Super = def.SuperProto;\r
+               //instance.SuperConstructor = X_Class_superConstructor;\r
+       //};\r
        obj = def.Constructor ?\r
                        def.Constructor.apply( instance, args ) :\r
                def.SuperConstructor &&\r
@@ -469,39 +559,5 @@ function X_Class_actualConstructor( obj, args ){
        };\r
        return instance;\r
 };\r
-/*  クラス定義を辿ってスーパークラスのコンストラクタを探す。\r
- *  呼び出したコンストラクタは配列に控える。\r
- *  さらに呼ばれた場合、配列を元にさらに奥のコンストラクタを取得\r
- *  TODO 現在 new しているインスタンスを保持してチェックする\r
- */\r
-function X_Class_superConstructor(){\r
-       var sClass = this,\r
-               i      = X_Class_CALLING_SUPER.indexOf( sClass ),\r
-               n      = -1,\r
-               l, sList, def, sConst, ret;\r
-\r
-       if( i === -1 ){\r
-               X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass;\r
-               X_Class_CALL_SUPER_STACK[ l ] = sList = [];\r
-       } else {\r
-               sList = X_Class_CALL_SUPER_STACK[ i ];\r
-       };\r
-       \r
-       while( sClass ){\r
-               def    = X_Class_getClassDef( sClass );\r
-               sClass = def.SuperClass;\r
-               sConst = def.SuperConstructor;\r
-               if( sConst && sList[ ++n ] !== sConst ){\r
-                       sList[ n ] = sConst;\r
-                       ret = sConst.apply( this, arguments );\r
-                       --sList.length;\r
-                       if( !sList.length ){\r
-                               X_Class_CALLING_SUPER.splice( i, 1 );\r
-                               X_Class_CALL_SUPER_STACK.splice( i, 1 );\r
-                       };\r
-                       return ret;\r
-               };\r
-       };\r
-};\r
 \r
 console.log( 'X.Core.Class' );\r
index 61250b1..8dc4e17 100644 (file)
@@ -3,6 +3,31 @@ var X_Event_last      = 0,
        X_Event_Rename    = {},\r
        X_Event_RenameTo  = {},\r
        \r
+       X_Event_proxy     = {\r
+               \r
+               load : X_UA.IE < 9 && {\r
+                               check : function( eventDispatcher ){\r
+                                       return eventDispatcher._tag === 'IFRAME' || eventDispatcher._tag === 'SCRIPT';\r
+                               },\r
+                               \r
+                               f : function( e ){\r
+                                       var raw = this._rawObject;\r
+                                       return raw.readyState !== 'complete' && raw.readyState !== 'loaded';\r
+                               }\r
+                       },\r
+               \r
+               contextmenu : X_UA.Opera && {\r
+                               \r
+                               rename : 'mousedown',\r
+                               \r
+                               f : function( e ){\r
+                                       return e.button === 2;\r
+                               }\r
+                               \r
+                       }\r
+               \r
+       },\r
+       \r
        X_Event_toPointer = !X_UA_HID.POINTER && ( X_UA_HID.TOUCH ?\r
                {\r
                        touchstart  : 'pointerdown',\r
index 8b29138..1ae7244 100644 (file)
@@ -74,8 +74,8 @@ X.EventDispatcher =
 \r
                /**\r
                 * _rawObject には HTMLElement, window, document, XHR といったイベントターゲットオブジェクトを設定します。\r
-                * _rawObject が設定されていると on(), off() 時に addEventListener(DOM Level2) や detachEvent(ie5~8), on~(DOM0) 等を操作します。\r
-                * _rawObject は最初の on() 前に設定しておかないと addEventListener 等が意図したように行われません。\r
+                * _rawObject が設定されていると listen(), unlisten() 時に addEventListener(DOM Level2) や detachEvent(ie5~8), on~(DOM0) 等を操作します。\r
+                * _rawObject は最初の listen() 前に設定しておかないと addEventListener 等が意図したように行われません。\r
                 * X.Node では非同期に HTMLElement を生成していて、要素生成以前に on, off を呼び出すことができます。これは適宜に migrateEvent, restoreEvent を呼んで解決しているためです。\r
                 * @private\r
                 * @type {Object}\r
@@ -140,11 +140,6 @@ X.EventDispatcher =
                 * @param {(eventHash|string|number)} e\r
                 */     \r
                        dispatch : X_EventDispatcher_dispatch,\r
-\r
-               /**\r
-                * @function\r
-                */\r
-                       on     : X_EventDispatcher_listen,\r
                        \r
                /**\r
                 * \r
@@ -172,8 +167,7 @@ X.EventDispatcher =
                                X_EventDispatcher_once = false;\r
                                return this;\r
                        },\r
-                       \r
-                       off      : X_EventDispatcher_unlisten,\r
+\r
                        unlisten : X_EventDispatcher_unlisten,\r
 \r
                /**\r
@@ -516,7 +510,7 @@ var X_EventDispatcher_actualAddEvent =
                                list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
                                list.sltoken    = raw.AddEventListener( type, list.slcallback );\r
                        } else\r
-                       if( X.UA.iOS && type === 'webkitTransitionEnd' ){\r
+                       if( X.UA.iOS && ( type === 'webkitTransitionEnd' || type === 'transitionend' ) ){\r
                                raw.addEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
                        } else {\r
                                console.log( 'event > ' + type );\r
@@ -608,7 +602,7 @@ var X_EventDispatcher_actualRemoveEvent =
                                delete list.sltoken;\r
                                delete list.slcallback;\r
                        } else\r
-                       if( X.UA.iOS && type === 'webkitTransitionEnd' ){\r
+                       if( X.UA.iOS && ( type === 'webkitTransitionEnd' || type === 'transitionend' ) ){\r
                                raw.removeEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
                        } else {\r
                                                                \r
index ceaabc6..ec0dac9 100644 (file)
@@ -71,7 +71,7 @@ Node.prototype.animate = function( start, dest, duration, easing, wait ){
        var obj = this._anime || ( this._anime = {} ), current;\r
        \r
        if( X_Node_Anime_hasTransition && this._rawObject ){\r
-               current = X_Node_Anime_getComputedPosition( this );\r
+               current = {}; //X_Node_Anime_getComputedPosition( this );\r
        };\r
        \r
        obj.duration  = X.Type.isFinite( duration ) && 0 <= duration ? duration : 500;\r