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 92044e1..3bcc3b8 100644 (file)
@@ -6,10 +6,12 @@
  *  AUTHOR: uupaa.js@gmail.com\r
  * \r
  */\r
-var X_ImgLoader_hasImage  = !!window[ 'Image' ],\r
-       X_ImgLoader_image     = X_ImgLoader_hasImage && new Image(),\r
+var X_ImgLoader_image     = window[ 'Image' ] && new Image(),\r
        // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する\r
-       X_ImgLoader_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_ImgLoader_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
@@ -23,16 +25,15 @@ X_TEMP.X_ImgLoader_init = function(){
                X_TEMP.X_ImgLoader_params\r
        );\r
        \r
-       X_ImgLoader[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_ImgLoader_handleEvent );\r
+       X_ImgLoader[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/ ], X_ImgLoader_handleEvent );\r
        \r
        delete X_TEMP.X_ImgLoader_init;\r
-       delete X_TEMP.X_ImgLoader_params;       \r
+       delete X_TEMP.X_ImgLoader_params;\r
        \r
        return X_ImgLoader;\r
 };\r
 \r
 X_TEMP.X_ImgLoader_params = {\r
-               _busy      : false,\r
                tick       : 0,\r
                timerID    : 0,\r
                finish     : false,\r
@@ -41,7 +42,6 @@ X_TEMP.X_ImgLoader_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
@@ -60,7 +60,6 @@ X_TEMP.X_ImgLoader_params = {
                        // abort がある?\r
                        raw && raw.abort && raw.abort();\r
                        // this[ '_rawObject' ].src = '';\r
-                       this._busy  = false;\r
                        this.finish = true;\r
                },\r
                \r
@@ -68,12 +67,12 @@ X_TEMP.X_ImgLoader_params = {
                        console.log( 'X.Net.Image:reset ' + this.abspath + ' timerID:' + this.timerID );\r
                        \r
                        this.timerID && X_Timer_remove( this.timerID );\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
@@ -81,8 +80,8 @@ function X_ImgLoader_detect(){
        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
@@ -90,7 +89,6 @@ function X_ImgLoader_detect(){
                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' ]( { type : X_EVENT_ERROR, 'timeout' : true } );\r
@@ -98,15 +96,18 @@ function X_ImgLoader_detect(){
 };\r
 \r
 function X_ImgLoader_handleEvent( e ){\r
-       var size;\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
@@ -115,10 +116,9 @@ function X_ImgLoader_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
@@ -133,10 +133,6 @@ function X_ImgLoader_handleEvent( e ){
                                // time , this[ '_rawObject' ].fileSize\r
                        } );\r
                        break;\r
-\r
-               case X_EVENT_KILL_INSTANCE :\r
-                       this.reset();\r
-                       break;\r
        };\r
 };\r
 \r