OSDN Git Service

Version 0.6.209, bug fixes X.Net.* & X.URL.
[pettanr/clientJs.git] / 0.6.x / js / 06_net / 04_XNetImage.js
index 1f9ac6d..3bcc3b8 100644 (file)
@@ -6,10 +6,12 @@
  *  AUTHOR: uupaa.js@gmail.com\r
  * \r
  */\r
-var X_Net_Image_hasImage  = !!window[ 'Image' ],\r
-       X_Net_Image_image     = X_Net_Image_hasImage && new Image(),\r
+var X_ImgLoader_image     = window[ 'Image' ] && new Image(),\r
        // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する\r
-       X_Net_Image_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_Net_Image_image );\r
+       X_ImgLoader_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_ImgLoader_image ),\r
+       // http://uupaa.hatenablog.com/entry/2013/12/17/171809\r
+       // お手軽に画像の読み込みをハンドリングする、今どきな方法\r
+       X_ImgLoader_0forError = !X_UA[ 'IE' ] || X_UA[ 'IE' ] === 11;\r
 \r
 /*\r
  * TODO\r
@@ -17,22 +19,21 @@ var X_Net_Image_hasImage  = !!window[ 'Image' ],
  * Image は、X.EventDispatcher で、<img> は X.Node で。 \r
  */\r
 \r
-X_TEMP.X_NET_Image_init = function(){\r
-       X_NET_ImageWrapper = X_Class_override(\r
-               X_Net_Image_isElement ? Node( X_Net_Image_image ) : X_EventDispatcher( X_Net_Image_image ),\r
-               X_TEMP.X_NET_Image_params\r
+X_TEMP.X_ImgLoader_init = function(){\r
+       X_ImgLoader = X_Class_override(\r
+               X_ImgLoader_isElement ? Node( X_ImgLoader_image ) : X_EventDispatcher( X_ImgLoader_image ),\r
+               X_TEMP.X_ImgLoader_params\r
        );\r
        \r
-       X_NET_ImageWrapper[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_NET_Image_handleEvent );\r
+       X_ImgLoader[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/ ], X_ImgLoader_handleEvent );\r
        \r
-       delete X_TEMP.X_NET_Image_init;\r
-       delete X_TEMP.X_NET_Image_params;       \r
+       delete X_TEMP.X_ImgLoader_init;\r
+       delete X_TEMP.X_ImgLoader_params;\r
        \r
-       return X_NET_ImageWrapper;\r
+       return X_ImgLoader;\r
 };\r
 \r
-X_TEMP.X_NET_Image_params = {\r
-               _busy      : false,\r
+X_TEMP.X_ImgLoader_params = {\r
                tick       : 0,\r
                timerID    : 0,\r
                finish     : false,\r
@@ -41,7 +42,6 @@ X_TEMP.X_NET_Image_params = {
                timeout    : 0,\r
                \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
@@ -51,7 +51,7 @@ X_TEMP.X_NET_Image_params = {
                        if( X_UA[ 'Opera7' ] && this[ '_rawObject' ].complete ){\r
                                this[ 'asyncDispatch' ]( 'load' );\r
                        } else {\r
-                               this.timerID = X_Timer_add( this.delay, 0, this, X_NET_Image_detect );\r
+                               this.timerID = X_Timer_add( this.delay, 0, this, X_ImgLoader_detect );\r
                        };\r
                },\r
                \r
@@ -60,48 +60,54 @@ X_TEMP.X_NET_Image_params = {
                        // abort がある?\r
                        raw && raw.abort && raw.abort();\r
                        // this[ '_rawObject' ].src = '';\r
-                       this._busy  = false;\r
                        this.finish = true;\r
                },\r
                \r
                reset : function(){\r
+                       console.log( 'X.Net.Image:reset ' + this.abspath + ' timerID:' + this.timerID );\r
+                       \r
                        this.timerID && X_Timer_remove( this.timerID );\r
-                       //X_Net_Image_isElement ? this[ '_rawObject' ].removeAttribute( 'src' ) : ( this[ '_rawObject' ].src = '' );\r
+                       this.timerID = 0;\r
+                       \r
+                       //X_ImgLoader_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
+                       this.finish  = false;\r
+                       this.abspath = '';\r
                }\r
        };\r
 \r
-function X_NET_Image_detect(){\r
+function X_ImgLoader_detect(){\r
        var raw = this[ '_rawObject' ];\r
        \r
        if( this.finish ) return;\r
+       \r
        if( raw && raw.complete ){\r
-               this._busy  = false;\r
                this.finish = true;\r
+               console.log( 'X.Net.Image:detect ' + raw.width );\r
                if( raw.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
+               this.timerID = this[ 'asyncDispatch' ]( { type : X_EVENT_ERROR, 'timeout' : true } );\r
        };\r
 };\r
 \r
-function X_NET_Image_handleEvent( e ){\r
-       var size;\r
+function X_ImgLoader_handleEvent( e ){\r
+       var raw = this[ '_rawObject' ], size;\r
+       \r
+       // IE11 reset() 時にここに入ってくる...\r
+       if( !this.abspath ) return;\r
+       console.log( 'X.Net.Image:handleEvent ' + e.type );\r
        \r
        switch( e.type ){\r
                case 'error' :\r
                //case 'abort' : // TODO ??\r
+                       // ie11(10,9 開発モード)で mineType 不正の場合、画像取得に成功してもエラーイベントが起こるのを無視する。\r
+                       if( X_ImgLoader_0forError && raw.width ) return;\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' ]( /*e.type === 'error' ?*/ X_EVENT_ERROR /*: X_EVENT_CANCELED*/ );\r
@@ -110,15 +116,14 @@ function X_NET_Image_handleEvent( e ){
                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
+                       if( X_UA[ 'Opera' ] && !raw.complete ){\r
                                this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
                                return;\r
                        };\r
 \r
-                       size = X_Util_Image_getActualDimension( !X_Net_Image_isElement ? this.abspath : this );\r
+                       size = X_Util_Image_getActualDimension( !X_ImgLoader_isElement ? this.abspath : this );\r
                        this.timerID = this[ 'asyncDispatch' ]( {\r
                                'type' : X_EVENT_SUCCESS,\r
                                'src'  : this.abspath,\r
@@ -128,13 +133,8 @@ function X_NET_Image_handleEvent( e ){
                                // time , this[ '_rawObject' ].fileSize\r
                        } );\r
                        break;\r
-\r
-               case X_EVENT_KILL_INSTANCE :\r
-                       this.reset();\r
-                       !X_Net_Image_hasImage && this[ 'kill' ](); // if xnode\r
-                       break;\r
        };\r
 };\r
 \r
 \r
-// X_Net_Image_isElement && X_NET_ImageWrapper[ 'appendAt' ]( X.X_Node_systemNode );\r
+// X_ImgLoader_isElement && X_ImgLoader[ 'appendAt' ]( X_Node_systemNode );\r