OSDN Git Service

Version 0.6.80, bugfix for .instanceOf().
authoritozyun <itozyun@user.sourceforge.jp>
Tue, 16 Sep 2014 13:40:28 +0000 (22:40 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Tue, 16 Sep 2014 13:40:28 +0000 (22:40 +0900)
0.6.x/js/00_core/02_XType.js
0.6.x/js/00_core/04_XClass.js
0.6.x/js/00_core/05_XTimer.js
0.6.x/js/01_dom/20_XDomImage.js
0.6.x/js/04_net/00_XNet.js
0.6.x/js/04_net/01_XNetXHR.js
0.6.x/js/04_net/02_XNetJSONP.js

index 005ea3e..c97f5fc 100644 (file)
@@ -49,13 +49,28 @@ X.Type = {
        isHTMLElement :\r
                new Function( 'v',\r
                        ( X.UA.IE4 || X.UA.MacIE ) ?\r
-                       'return v&&v.tagName' : // ie4 or MacIE5.23, v.all <- error\r
+                               'return v&&v.tagName' : // ie4 or MacIE5.23, v.all <- error\r
                        window[ 'HTMLElement' ] ?\r
                                'return v instanceof HTMLElement' :\r
                        //window[ 'Element' ] ?\r
                        //      'return v instanceof Element' : // error @ie8\r
                                'return v&&v.nodeType===1&&v.appendChild'\r
                ),\r
+       \r
+       /*\r
+        * new Image した場合に HTMLElement の img が作られるブラウザもある\r
+        */     \r
+       isImage :\r
+               function( v ){\r
+                       if( v && v.constructor === window.Image ) return true;\r
+                       if( v && v.constructor === window.HTMLImageElement ) return true;\r
+                       if( X.UA.WebKit < 525.13 ){ // Safari3-\r
+                               if( v && v.src !== undefined && v.onload !== undefined && X.Type.isNumber( v.height ) && X.Type.isNumber( v.width ) && X.Type.isBoolean( v.complete ) ){\r
+                                       return true;\r
+                               };\r
+                       };\r
+                       return false;\r
+               },\r
        /*\r
        isElementCollection : function(v) {\r
                return (Object.prototype.toString.call(v) === "[object HTMLCollection]");\r
index 76e0957..dfe3340 100644 (file)
@@ -78,12 +78,15 @@ X.Class = ( function(){
                klass  = X.Class.create.apply( X.Class, params );\r
                traits = null;\r
                \r
+               def    = X.Class._getClassDef( klass );\r
                // 継承用プロパティを控える\r
                if( opt_super === true ){\r
-                       def = X.Class._getClassDef( klass );\r
+                       def.superAccess = true;\r
                        def.Super = Super;\r
                        def.SuperProto = Super.prototype;\r
                        def.SuperConstructor = superDef[ CONSTRUCTOR ] || superDef.SuperConstructor;\r
+               } else {\r
+                       def.Super = Super; // instanceOf() で親クラスを調べる!\r
                };\r
                \r
                return klass;\r
@@ -107,7 +110,9 @@ X.Class = ( function(){
                        \r
                        // onKill() === false の場合、kill のキャンセル\r
                        // private      は false での キャンセル は無視される\r
+                       \r
                        if( this.instanceOf( X.EventDispatcher ) ){\r
+                               console.log( 'this.instanceOf( X.EventDispatcher )! ' + this._dispatching );\r
                                if( !def.isPrivate ){\r
                                        if( this._dispatching ){\r
                                                this.dispatch( X.Event.BEFORE_KILL_INSTANCE );\r
@@ -119,8 +124,9 @@ X.Class = ( function(){
                                                this.dispatch( X.Event.KILL_INSTANCE_CANCELED );\r
                                                return;\r
                                        };\r
+                               } else {\r
+                                       this.dispatch( X.Event.BEFORE_KILL_INSTANCE );  \r
                                };\r
-                               this.dispatch( X.Event.BEFORE_KILL_INSTANCE );\r
                                this.dispatch( X.Event.KILL_INSTANCE );\r
                                this._listeners && this.unlisten();\r
                        } else\r
@@ -128,6 +134,8 @@ X.Class = ( function(){
                                return;\r
                        };\r
                        \r
+                       console.log('kill ' + this._dispatching);\r
+                       \r
                        for( p in instance ){\r
                                if( instance.hasOwnProperty && !instance.hasOwnProperty( p ) ) continue;\r
                                delete instance[ p ];\r
@@ -200,7 +208,7 @@ X.Class = ( function(){
                } else {\r
                        def.live && def.live.push( instance );\r
                };\r
-               if( def.Super ){\r
+               if( def.superAccess ){\r
                        // TODO klass.prototype に移動\r
                        instance.Super = def.SuperProto;\r
                        instance.SuperConstructor = superConstructor;\r
index 42b5157..a36d4b8 100644 (file)
@@ -62,7 +62,8 @@ X.Timer = {
                        list  = X.Timer.TICKET_LIST,\r
                        i     = 0,\r
                        l     = list.length,\r
-                       start = X.getTime(),\r
+                       limit = X.getTime() + X.Timer.INTERVAL_TIME / 2,\r
+                       heavy,\r
                        q, f, c, r;\r
                \r
                if( X.Timer.busy ){\r
@@ -74,6 +75,10 @@ X.Timer = {
            for( ; i < l; ++i ){\r
                q = list[ i ];\r
                        if( 0 < ( q.last -= next ) ) continue;\r
+                       if( heavy ){\r
+                               if( q.last <= 0 ) q.last = 1;\r
+                               continue;\r
+                       };\r
                        c = q.count;\r
                        \r
                        if( q.k ){\r
@@ -83,6 +88,14 @@ X.Timer = {
                                r = q.f();\r
                        };\r
                        \r
+                       console.log( 'fire....' );\r
+                       \r
+                       if( limit <= X.getTime() ){\r
+                               console.log( 'heavy' );\r
+                               // 関数の実行に時間が係る場合、次のタイミングに\r
+                               heavy = true;\r
+                       };                      \r
+                       \r
                        if( r & X.Callback.UN_LISTEN || c === 1 ){\r
                                list.splice( i, 1 );\r
                                --i;\r
@@ -91,11 +104,6 @@ X.Timer = {
                        } else\r
                        if( 1 < c ) --q.count;\r
                        q.last = q.time;\r
-                       \r
-                       if( start < X.getTime() ){\r
-                               console.log( '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@' );\r
-                               break;\r
-                       };\r
            };\r
            X.Timer.timerId = 0;\r
            X.Timer.busy = false;\r
index d1d417f..e5769b8 100644 (file)
@@ -32,6 +32,10 @@ X.Dom.Image = {
                        } else\r
                        if( X.Type.isHTMLElement( XnodeOrImageElemOrSrc ) ){\r
                                img = XnodeOrImageElemOrSrc;\r
+                       } else\r
+                       if( XnodeOrImageElemOrSrc.constructor === X.EventDispatcher && X.Type.isImage( XnodeOrImageElemOrSrc._rawObject ) ){\r
+                               xnode = XnodeOrImageElemOrSrc;\r
+                               img   = xnode._rawObject;\r
                        } else {\r
                                return;\r
                        };\r
index 3f6e492..d3604f4 100644 (file)
@@ -2,11 +2,11 @@
 X.Net = {\r
 \r
        xhrGet : function( url ){\r
-               return new X_NET_Queue( X_NET_TYPE_XHR, { type : 'get', get : url } );\r
+               return new X_NET_Queue( X_NET_TYPE_XHR, { method : 'GET', get : url } );\r
        },\r
        \r
        xhrPost : function( url ){\r
-               return new X_NET_Queue( X_NET_TYPE_XHR, { type : 'post', post : url } );\r
+               return new X_NET_Queue( X_NET_TYPE_XHR, { method : 'POST', post : url } );\r
        },\r
        \r
        formGet : function(){\r
@@ -59,7 +59,7 @@ var X_NET_TYPE_XHR   = 1,
                                this.type = type;\r
                                this.data = data;                               \r
                                \r
-                               this.listen( X.Event.COMPLETE, this, X_NET_proxyDispatch );\r
+                               this.listen( X.Event.COMPLETE, X_NET_proxyDispatch );\r
                                \r
                                X_NET_QUEUE_LIST[ X_NET_QUEUE_LIST.length ] = this;\r
                                !X_NET_currentQueue && X_NET_shiftQueue();\r
@@ -73,7 +73,7 @@ var X_NET_TYPE_XHR   = 1,
                                var i = X_NET_QUEUE_LIST.indexOf( this );\r
                                if( i !== -1 ){\r
                                        X_NET_QUEUE_LIST.splice( i, 1 );\r
-                                       this.asyncDispatch( 0, { type : X.Event.COMPLETE } );\r
+                                       this.asyncDispatch( 0, { type : X.Event.CANCELED } );\r
                                } else\r
                                if( this === X_NET_currentQueue ){\r
                                        X_NET_currentWrapper.cancel();\r
@@ -96,17 +96,16 @@ function X_NET_proxyDispatch( e ){
                        break;\r
                case X.Event.SUCCESS :\r
                case X.Event.ERROR :\r
+               case X.Event.CANCELED :\r
                        console.log( 'q: ' + e.type );\r
                        this.dispatch( e );\r
                        this.asyncDispatch( 0, { type : X.Event.COMPLETE } );\r
                        break;\r
-               case X.Event.CANCELED :\r
-                       \r
-                       break;\r
                case X.Event.COMPLETE :\r
+                       console.log( 'complete. then kill()' );\r
                        this.kill();\r
                        X_NET_shiftQueue();\r
-                       break;\r
+                       break;          \r
        };\r
 };\r
 \r
@@ -115,14 +114,14 @@ function X_NET_shiftQueue(){
        \r
        if( X_NET_currentQueue ){\r
                if( X_NET_currentWrapper._busy ) return;\r
-               X_NET_currentWrapper.unlisten( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], X_NET_currentQueue, X_NET_proxyDispatch );\r
-               X_NET_currentQueue.reset();\r
-       };\r
-       \r
-       if( !X_NET_QUEUE_LIST.length ){\r
+               X_NET_currentWrapper\r
+                       .unlisten( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], X_NET_currentQueue, X_NET_proxyDispatch )\r
+                       .reset();\r
                X_NET_currentQueue = X_NET_currentWrapper = null;\r
-               return;\r
        };\r
+       \r
+       if( !X_NET_QUEUE_LIST.length ) return;\r
+\r
        queue = X_NET_QUEUE_LIST.shift();\r
        \r
        switch( queue.type ){\r
@@ -137,7 +136,7 @@ function X_NET_shiftQueue(){
                        break;\r
        };\r
        \r
-       X_NET_currentWrapper.listen( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS, X.Event.COMPLETE ], X_NET_currentQueue = queue, X_NET_proxyDispatch );\r
+       X_NET_currentWrapper.listen( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], X_NET_currentQueue = queue, X_NET_proxyDispatch );\r
        \r
        X_NET_currentWrapper.load( queue.data );\r
 };\r
index a7732f3..91330ef 100644 (file)
@@ -57,6 +57,7 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
                                                \r
                        _rawObject    : X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X,\r
                        _isXHR        : true,\r
+                       _isXDR        : false, // for ie8\r
                        \r
                        _method       : null,\r
                        _type         : null,\r
@@ -101,12 +102,13 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
                                        };              \r
                                };\r
                                \r
+                               // send 前にフラグを立てる,回線が早いと raw.send() 内で onload -> _busy = false ののち、 _busy = true するケースがあるため。\r
+                               this._busy = true;\r
+                               \r
                                // http://allabout.co.jp/gm/gc/24097/#1\r
                                // sendをonreadystatechangeの前に記述すると、ieでは動作しなくなります、、、。\r
                                // konquerorでエラーが発生するのでここでは、とりあえず、send('') としました。\r
                                raw.send( postbody || '' );\r
-                               \r
-                               this._busy = true;\r
                        },\r
                        \r
                        cancel : X.Net.XHR.CANCELABLE ?\r
@@ -119,8 +121,7 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
                        \r
                        reset : function(){\r
                                this._method       = this._type = null;\r
-                               this._canceled     = false;\r
-                               this._busy         = false;\r
+                               this._canceled     = this._busy = false;\r
                                this._lastProgress = 0;\r
                        },\r
                        \r
@@ -207,12 +208,14 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
                                                                case 'arraybuffer' :\r
                                                        };\r
                                                        \r
-                                                               console.log( 'status ' + status );\r
-                                                               //console.dir( raw );\r
+                                                       //console.log( 'status ' + status );\r
+                                                       //console.dir( raw );\r
+                                                       \r
                                                        this._busy = false;\r
                                                        this.asyncDispatch( 0, { type : X.Event.SUCCESS, status : status || 200, data : data } );                                                       \r
                                                } else {\r
                                                        console.log( 'status ' + status );\r
+                                                       this._busy = false;\r
                                                        //console.dir( raw );\r
                                                        live && this.asyncDispatch( 0, { type : X.Event.ERROR, status : raw.status || 0, percent : 100 } );\r
                                                };\r
@@ -227,18 +230,18 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
                                        \r
                                        case 'error' :\r
                                        //console.dir( e );\r
+                                               this._busy = false;\r
                                                live && this.asyncDispatch( 0, { type : X.Event.ERROR, status : raw.status } );\r
                                                break;\r
                                        \r
                                        //case 'abort' :\r
+                                       //      this._busy = false;\r
                                        //      this.asyncDispatch( 0, { type : X.Event.ERROR, status : raw.status } );\r
                                        //      break;\r
                                        case 'timeout' : // Gecko 12.0 https://developer.mozilla.org/ja/docs/XMLHttpRequest/Synchronous_and_Asynchronous_Requests\r
+                                               this._busy = false;\r
                                                live && this.asyncDispatch( 0, { type : X.Event.ERROR, status : raw.status } );\r
                                                break;\r
-                                               \r
-                                       case 'loadend' :\r
-                                               break;\r
                                };\r
                        },\r
                        \r
@@ -253,7 +256,7 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
        // 同期リクエストでなければならない場合, unload, beforeunload時\r
 \r
 \r
-       // ie8 では timeout が有効\r
+       // ie8 では timeout が有効, MSXML のバージョンで決定すべき?\r
        if( X.UA.IE8 ){\r
                X_NET_XHRWrapper.listen( [ 'readystatechange', 'error', 'abort', 'timeout' ] );\r
        } else\r
@@ -272,18 +275,5 @@ if( X.Net.XHR.W3C || X_Net_XHR_ACTIVE_X ){
        if( X.Net.XHR.UL_PROGRESS ){\r
                X_NET_XHRWrapper._rawObject.upload.addEventListener( 'progress', X.Net.XHR.xhr.onUploadProgress );\r
        };\r
-       \r
-       \r
-       var X_NET_XHR_lastReadyState = 0;\r
-       \r
-       function X_NET_XHR_checkReadyStateTimer(){\r
-               //console.log( '-' );\r
-               if( X_NET_XHR_lastReadyState < X_NET_XHRWrapper._rawObject.readyState ){\r
-                       X_NET_XHR_lastReadyState = X_NET_XHRWrapper._rawObject.readyState;\r
-                       X_NET_XHRWrapper.dispatch( { type : 'readystatechange' } );\r
-                       console.log( '- ' + X_NET_XHR_lastReadyState );\r
-                       if( 4 <= X_NET_XHR_lastReadyState ) return X.Callback.UN_LISTEN;\r
-               };\r
-       };\r
 };\r
 \r
index a9b2458..48d4371 100644 (file)
@@ -10,6 +10,8 @@ X.Net.JSONP = {
        cb : function( accessKey, jsonString, time, opt_json2FileSize ){
                        if( accessKey !== X_NET_JSONP_ACCESS_KEY ) return;
                        
+                       X_NET_JSONPWrapper._busy = false;
+                       
                        X_NET_JSONPWrapper
                                .asyncDispatch( 0, {
                                        type : jsonString ? X.Event.SUCCESS : X.Event.ERROR,
@@ -22,25 +24,32 @@ X.Net.JSONP = {
 
 var X_NET_JSONP_ACCESS_KEY = Math.random(),
        
-       X_NET_JSONP_NinjaIframe,
-       
-       X_NET_JSONP_imageFixListener = X.UA.Opera && function( e ){
-               switch( e.type ){
-                       case X.Event.SUCCESS :
-                       case X.Event.ERROR :
-                               X_NET_JSONP_loadScriptInNinjaIframe( e.src );
-                       case X.Event.TIMEOUT :
-                       case X.Event.CANCELED :
-               };
+       X_NET_JSONP_NinjaIframe;
+
+
+function X_NET_JSONP_operaImageHandleEvent( e ){
+       switch( e.type ){
+               case X.Event.SUCCESS :
+               case X.Event.ERROR :
+                       X_NET_JSONP_loadScriptInNinjaIframe( e.src );
+                       break;
+               case X.Event.TIMEOUT :
+               case X.Event.CANCELED :
+                       X_NET_JSONPWrapper._operaImage.unlisten().reset();
+                       X_NET_JSONPWrapper.asyncDispatch( 0, X.Event.ERROR );
+                       break;
        };
+};
+if( !X.UA.Opera ) X_NET_JSONP_operaImageHandleEvent = null;
+
 
 function X_NET_JSONP_loadScriptInNinjaIframe( url ){
-       X_NET_JSONP_NinjaIframe || ( X_NET_JSONP_NinjaIframe = new X.Util.NinjaIframe() );
-       
        var json2Path     = 'js/libs/json2.js',
                json2FileSize = 18103,
                html;
        
+       X_NET_JSONP_NinjaIframe || ( X_NET_JSONP_NinjaIframe = new X.Util.NinjaIframe() );
+       
        if( X.UA.IE8 ){
                html = [
                        // http://blog.livedoor.jp/dankogai/archives/51503830.html              
@@ -136,16 +145,15 @@ X_NET_JSONPWrapper = X.Class._override(
        new X.EventDispatcher(),
        {
 
-               _operaImage   : null, // X.Dom.Image.Loader();
+               _operaImage   : null, // X.Net.Image();
                _busy         : false,
                _canceled     : false,
                
                load : function( url, data, timeout ){
-                       
                        //createURL
-                       if( X_NET_JSONP_imageFixListener ){
-                               this._operaImage = X.Dom.Image.Loader( url )
-                                       .listenOnce( [ X.Event.SUCCESS, X.Event.ERROR ], X_NET_JSONP_imageFixListener );
+                       if( X_NET_JSONP_operaImageHandleEvent ){
+                               this._operaImage = X.Net.Image( url )
+                                       .listenOnce( [ X.Event.SUCCESS, X.Event.ERROR ], X_NET_JSONP_operaImageHandleEvent );
                        } else {
                                X_NET_JSONP_loadScriptInNinjaIframe( url );
                        };