OSDN Git Service

Version 0.6.104, fix X_shortcut & etc.
[pettanr/clientJs.git] / 0.6.x / js / 05_net / 04_XNetImage.js
index 84d200d..6a90a46 100644 (file)
@@ -8,24 +8,29 @@
 \r
 var X_Net_Image_hasImage  = !!window[ 'Image' ],\r
        X_Net_Image_image     = X_Net_Image_hasImage && new Image(),\r
-       X_Net_Image_isElement = X.Type.isHTMLElement( X_Net_Image_image );\r
+       // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する\r
+       X_Net_Image_isElement = !( X_UA.IE < 9 ) && X.Type.isHTMLElement( X_Net_Image_image );\r
        \r
 \r
 if( !X_Net_Image_hasImage ){\r
        alert( 'no Image!' );\r
+} else\r
+if( X_Net_Image_isElement ){\r
+       //alert( 'X_Net_Image_isElement ' + X_Net_Image_isElement );\r
 };\r
 \r
 /*\r
  * TODO\r
  * new Image() のときに Image オブジェクトを作るもの(IE8-)と、HTMLImageElement を作るものがある。\r
- * Image は、X.EventDispatcher で、<img> は X.Dom.Node で。\r
+ * Image は、X.EventDispatcher で、<img> は X.Node で。 \r
+ * \r
+ * Opera7 では毎回 image を作る必要あり、src が異なればOK?\r
  */\r
-X_NET_ImageWrapper = ( !X_Net_Image_isElement ? X.EventDispatcher : X.Dom.Node ).inherits(\r
-       'X.Net.Image',\r
-       X.Class.POOL_OBJECT,\r
+X_NET_ImageWrapper = X_Class_override(\r
+       !X_Net_Image_isElement ? new X.EventDispatcher( X_Net_Image_image ) : new X.Node( X_Net_Image_image ),\r
        {\r
-               _rawObject : X_Net_Image_image,\r
-               \r
+\r
+               _busy      : false,\r
                tick       : 0,\r
                timerID    : 0,\r
                finish     : false,\r
@@ -33,45 +38,53 @@ X_NET_ImageWrapper = ( !X_Net_Image_isElement ? X.EventDispatcher : X.Dom.Node )
                delay      : 0,\r
                timeout    : 0,\r
                \r
-               Constructor : X_Net_Image_hasImage ?\r
-                       (function(){\r
-                               this.listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT, X.Event.KILL_INSTANCE ] );\r
-                       }) :\r
-                       (function(){\r
-                               this.SuperConstructor( document.createElement( 'img' ) )\r
-                                       .appendTo( X.Dom.Node._systemNode )\r
-                                       .listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT, X.Event.KILL_INSTANCE ] );\r
-                       }),\r
-               \r
-               load : function( abspath, opt_delay, opt_timeout ){\r
-                       this.abspath = abspath;\r
-                       this.delay   = opt_delay || 100;\r
-                       this.timeout = opt_timeout || 10000;\r
+               load : function( data ){\r
+                       this._busy   = true;\r
+                       this.abspath = X.URL.toAbsolutePath( data.url );\r
+                       this.delay   = data.delay || 100;\r
+                       this.timeout = data.timeout || 5000;\r
                        this.timerID = X.Timer.add( this.delay, 0, this, this._detect );\r
                        \r
-                       X_Net_Image_hasImage ? ( this._rawObject.src = abspath ) : this.attr( 'src', abspath );\r
+                       //X_Net_Image_hasImage ? ( this._rawObject.src = this.abspath ) : this.attr( 'src', this.abspath );\r
+                       /*\r
+                       if( X_UA.Opera7 ){\r
+                               X_EventDispatcher_toggleAllEvents( this, false );\r
+                               this._rawObject = new Image();\r
+                               X_EventDispatcher_toggleAllEvents( this, true );\r
+                       }; */\r
+                       \r
+                       this._rawObject.src = this.abspath;\r
+                       //alert( this._rawObject.src + ' ' + this._rawObject.complete );\r
+                       if( X_UA.Opera7 && this._rawObject.complete ){\r
+                               this.asyncDispatch( 'load' );\r
+                       } else {\r
+                               this.timerID = X.Timer.add( this.delay, 0, this, this._detect );\r
+                       };\r
+                       //alert( this._rawObject.src + ' ' + this._rawObject.complete );\r
                },\r
                \r
                handleEvent : function( e ){\r
                        var size;\r
                        switch( e.type ){\r
                                case 'error' :\r
-                               case 'abort' : // TODO ??\r
+                               //case 'abort' : // TODO ??\r
                                        if( this.finish ) return;\r
+                                       this._busy  = false;\r
                                        this.finish  = true;\r
                                        this.timerID && X.Timer.remove( this.timerID );\r
-                                       this.timerID = this.asyncDispatch( { type : X.Event.ERROR } );\r
+                                       this.timerID = this.asyncDispatch( /*e.type === 'error' ?*/ X.Event.ERROR /*: X.Event.CANCELED*/ );\r
                                        break;\r
                                case 'load' :\r
                                // if( finish === true ) return; // これがあると firefox3.6 で駄目、、、\r
                                // if( timer ) return; // これがあると safari3.2 で駄目、、、\r
+                                       this._busy  = false;\r
                                        this.finish = true;\r
                                        this.timerID && X.Timer.remove( this.timerID );\r
-                                       if( X.UA.Opera && !this._rawObject.complete ){\r
-                                               this.timerID = this.asyncDispatch( { type : X.Event.ERROR } );\r
+                                       if( X_UA.Opera && !this._rawObject.complete ){\r
+                                               this.timerID = this.asyncDispatch( X.Event.ERROR );\r
                                                return;\r
                                        };\r
-                                       size = X.Dom.Image.getActualDimension( !X_Net_Image_isElement ? this.abspath : this );\r
+                                       size = X.Util.Image.getActualDimension( !X_Net_Image_isElement ? this.abspath : this );\r
                                        this.timerID = this.asyncDispatch( {\r
                                                type : X.Event.SUCCESS,\r
                                                src  : this.abspath,\r
@@ -79,42 +92,50 @@ X_NET_ImageWrapper = ( !X_Net_Image_isElement ? X.EventDispatcher : X.Dom.Node )
                                                h    : size[ 1 ]\r
                                        } );\r
                                        break;\r
-                               case X.Event.SUCCESS :\r
-                               case X.Event.ERROR :\r
-                               case X.Event.TIMEOUT :\r
-                                       this.timerID && X.Timer.remove( this.timerID );\r
-                                       this.timerID = this.asyncDispatch( X.Event.COMPLETE );\r
-                                       break;\r
                                case X.Event.KILL_INSTANCE :\r
                                        this.reset();\r
                                        !X_Net_Image_hasImage && this.destroy(); // if xnode\r
-                                       this.unlisten();\r
                                        break;\r
                        };\r
-               },      \r
+               },\r
+               \r
                _detect : function(){\r
                        if( this.finish ) return;\r
                        if( this._rawObject && this._rawObject.complete ){\r
+                               this._busy  = false;\r
                                this.finish = true;\r
                                if( this._rawObject.width ) return;\r
                                X.Timer.remove( this.timerID );\r
                                this.timerID = this.asyncDispatch( X.Event.ERROR );\r
                        } else\r
                        if( this.timeout < ( this.tick += this.delay ) ){\r
+                               this._busy  = false;\r
                                this.finish = true;\r
                                X.Timer.remove( this.timerID );\r
                                this.timerID = this.asyncDispatch( X.Event.TIMEOUT );\r
                        };\r
                },\r
+               \r
                cancel : function(){\r
-                       this._rawObject && this._rawObject.abort();\r
+                       // abort がある?\r
+                       this._rawObject && this._rawObject.abort && this._rawObject.abort();\r
+                       this._busy  = false;\r
+                       this.finish = true;\r
+                       this.asyncDispatch( X.Event.CANCELED );\r
                },\r
                \r
                reset : function(){\r
                        this.timerID && X.Timer.remove( this.timerID );\r
+                       //X_Net_Image_isElement ? this._rawObject.removeAttribute( 'src' ) : ( this._rawObject.src = '' );\r
+                       this._rawObject.src = '';\r
                        this.timerID  = 0;\r
+                       this._busy    = false;\r
                        this.finished = false;\r
                        this.abspath  = '';\r
                }\r
        }\r
 );\r
+\r
+X_NET_ImageWrapper.listen( [ 'load', 'error' /*, 'abort'*/, X.Event.KILL_INSTANCE ] );\r
+\r
+// X_Net_Image_isElement && X_NET_ImageWrapper.appendTo( X.X_Node_systemNode );\r