1 //{+netimage"画像の読み込み監視"(Imageの読み込みを監視し画像表示のコントロールを行う)[+net,+utilimage]
\r
5 * URL: http://d.hatena.ne.jp/uupaa/20080413/1208067631
\r
6 * AUTHOR: uupaa.js@gmail.com
\r
9 var X_ImgLoader_image = window[ 'Image' ] && new Image(),
\r
10 // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する
\r
11 X_ImgLoader_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_ImgLoader_image ),
\r
12 // http://uupaa.hatenablog.com/entry/2013/12/17/171809
\r
13 // お手軽に画像の読み込みをハンドリングする、今どきな方法
\r
14 X_ImgLoader_0forError = !X_UA[ 'IE' ] || X_UA[ 'IE' ] === 11 || X_UA[ 'IEHost' ] === 11;
\r
18 * new Image() のときに Image オブジェクトを作るもの(IE8-)と、HTMLImageElement を作るものがある。
\r
19 * Image は、X.EventDispatcher で、<img> は X.Node で。
\r
22 X_TEMP.X_ImgLoader_init = function(){
\r
23 X_ImgLoader = X_Class_override(
\r
24 X_ImgLoader_isElement ? Node( X_ImgLoader_image ) : X_EventDispatcher( X_ImgLoader_image ),
\r
25 X_TEMP.X_ImgLoader_params
\r
28 X_ImgLoader[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/ ], X_ImgLoader_handleEvent );
\r
30 delete X_TEMP.X_ImgLoader_init;
\r
31 delete X_TEMP.X_ImgLoader_params;
\r
36 X_TEMP.X_ImgLoader_params = {
\r
44 load : function( data ){
\r
45 this.abspath = X_URL_toAbsolutePath( data[ 'url' ] );
\r
46 this.delay = data[ 'delay' ] || 100;
\r
47 this.timeout = data[ 'timeout' ] || 5000;
\r
49 this[ '_rawObject' ].src = this.abspath;
\r
51 if( X_UA[ 'Opera7' ] && this[ '_rawObject' ].complete ){
\r
52 this[ 'asyncDispatch' ]( 'load' );
\r
54 this.timerID = X_Timer_add( this.delay, 0, this, X_ImgLoader_detect );
\r
58 cancel : function(){
\r
59 var raw = this[ '_rawObject' ];
\r
61 raw && raw.abort && raw.abort();
\r
62 // this[ '_rawObject' ].src = '';
\r
67 //console.log( '/ X.Net.Image:reset ' + this.abspath + ' timerID:' + this.timerID );
\r
69 this.timerID && X_Timer_remove( this.timerID );
\r
72 this.finish = false;
\r
74 //X_ImgLoader_isElement ? this[ '_rawObject' ].removeAttribute( 'src' ) : ( this[ '_rawObject' ].src = '' );
\r
75 this[ '_rawObject' ].src = '';
\r
77 //console.log( '\ X.Net.Image:reset ----------- *' );
\r
81 function X_ImgLoader_detect(){
\r
82 var raw = this[ '_rawObject' ];
\r
84 if( this.finish ) return;
\r
86 if( raw && raw.complete ){
\r
88 //console.log( 'X.Net.Image:detect ' + raw.width );
\r
89 if( raw.width ) return;
\r
90 X_Timer_remove( this.timerID );
\r
91 //console.log( '* X.Net.Image:ERROR @detect(1) ' + this.abspath );
\r
92 this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );
\r
94 if( this.timeout < ( this.tick += this.delay ) ){
\r
96 X_Timer_remove( this.timerID );
\r
97 //console.log( '* X.Net.Image:ERROR @detect(2) ' + this.abspath );
\r
98 this.timerID = this[ 'asyncDispatch' ]( { type : X_EVENT_ERROR, 'timeout' : true } );
\r
102 function X_ImgLoader_handleEvent( e ){
\r
103 var raw = this[ '_rawObject' ], size;
\r
105 // IE11 reset() 時にここに入ってくる...
\r
106 if( !this.abspath ) return;
\r
107 //console.log( 'X.Net.Image:handleEvent ' + e.type );
\r
111 // ie11(10,9 開発モード)で mineType 不正の場合、画像取得に成功してもエラーイベントが起こるのを無視する。
\r
112 if( X_ImgLoader_0forError && raw.width ) return;
\r
113 if( this.finish ) return;
\r
114 this.finish = true;
\r
115 this.timerID && X_Timer_remove( this.timerID );
\r
116 //console.log( '* X.Net.Image:ERROR @handle ' + this.abspath + X.Timer.now() );
\r
117 //console.dir( raw );
\r
118 this.timerID = this[ 'asyncDispatch' ]( this.timeout, X_EVENT_ERROR );
\r
122 // if( finish === true ) return; // これがあると firefox3.6 で駄目、、、
\r
123 // if( timer ) return; // これがあると safari3.2 で駄目、、、
\r
124 this.finish = true;
\r
125 this.timerID && X_Timer_remove( this.timerID );
\r
126 if( X_UA[ 'Opera' ] && !raw.complete ){
\r
127 this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );
\r
131 //console.log( '* X.Net.Image:LOAD @handle ' + this.abspath + X.Timer.now() );
\r
132 //console.dir( raw );
\r
134 size = X_Util_Image_getActualDimension( !X_ImgLoader_isElement ? this.abspath : this );
\r
135 this.timerID = this[ 'asyncDispatch' ]( {
\r
136 'type' : X_EVENT_SUCCESS,
\r
137 'src' : this.abspath,
\r
140 // TODO feedback net speed
\r
141 // time , this[ '_rawObject' ].fileSize
\r
148 // X_ImgLoader_isElement && X_ImgLoader[ 'appendAt' ]( X_Node_systemNode );
\r