4 * URL: http://d.hatena.ne.jp/uupaa/20080413/1208067631
\r
5 * AUTHOR: uupaa.js@gmail.com
\r
9 var X_Net_Image_hasImage = !!window[ 'Image' ],
\r
10 X_Net_Image_image = X_Net_Image_hasImage && new Image(),
\r
11 // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する
\r
12 X_Net_Image_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_Net_Image_image );
\r
15 if( !X_Net_Image_hasImage ){
\r
16 alert( 'no Image!' );
\r
18 if( X_Net_Image_isElement ){
\r
19 //alert( 'X_Net_Image_isElement ' + X_Net_Image_isElement );
\r
24 * new Image() のときに Image オブジェクトを作るもの(IE8-)と、HTMLImageElement を作るものがある。
\r
25 * Image は、X.EventDispatcher で、<img> は X.Node で。
\r
27 * Opera7 では毎回 image を作る必要あり、src が異なればOK?
\r
30 X_TEMP.X_NET_Image_init = function(){
\r
32 delete X_TEMP.X_NET_Image_init;
\r
34 X_NET_ImageWrapper = X_Class_override(
\r
35 !X_Net_Image_isElement ? X_EventDispatcher( X_Net_Image_image ) : Node( X_Net_Image_image ),
\r
46 load : function( data ){
\r
48 this.abspath = X_URL_toAbsolutePath( data[ 'url' ] );
\r
49 this.delay = data[ 'delay' ] || 100;
\r
50 this.timeout = data[ 'timeout' ] || 5000;
\r
52 this[ '_rawObject' ].src = this.abspath;
\r
54 if( X_UA[ 'Opera7' ] && this[ '_rawObject' ].complete ){
\r
55 this[ 'asyncDispatch' ]( 'load' );
\r
57 this.timerID = X_Timer_add( this.delay, 0, this, X_NET_Image_detect );
\r
61 cancel : function(){
\r
63 this[ '_rawObject' ] && this[ '_rawObject' ].abort && this[ '_rawObject' ].abort();
\r
64 // this[ '_rawObject' ].src = '';
\r
70 this.timerID && X_Timer_remove( this.timerID );
\r
71 //X_Net_Image_isElement ? this[ '_rawObject' ].removeAttribute( 'src' ) : ( this[ '_rawObject' ].src = '' );
\r
72 this[ '_rawObject' ].src = '';
\r
75 this.finished = false;
\r
81 X_NET_ImageWrapper[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_NET_Image_handleEvent );
\r
83 return X_NET_ImageWrapper;
\r
87 function X_NET_Image_detect(){
\r
88 if( this.finish ) return;
\r
89 if( this[ '_rawObject' ] && this[ '_rawObject' ].complete ){
\r
92 if( this[ '_rawObject' ].width ) return;
\r
93 X_Timer_remove( this.timerID );
\r
94 this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );
\r
96 if( this.timeout < ( this.tick += this.delay ) ){
\r
99 X_Timer_remove( this.timerID );
\r
100 this.timerID = this[ 'asyncDispatch' ]( X_EVENT_TIMEOUT );
\r
104 function X_NET_Image_handleEvent( e ){
\r
109 //case 'abort' : // TODO ??
\r
110 if( this.finish ) return;
\r
111 this._busy = false;
\r
112 this.finish = true;
\r
113 this.timerID && X_Timer_remove( this.timerID );
\r
114 this.timerID = this[ 'asyncDispatch' ]( /*e.type === 'error' ?*/ X_EVENT_ERROR /*: X_EVENT_CANCELED*/ );
\r
118 // if( finish === true ) return; // これがあると firefox3.6 で駄目、、、
\r
119 // if( timer ) return; // これがあると safari3.2 で駄目、、、
\r
120 this._busy = false;
\r
121 this.finish = true;
\r
122 this.timerID && X_Timer_remove( this.timerID );
\r
123 if( X_UA[ 'Opera' ] && !this[ '_rawObject' ].complete ){
\r
124 this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );
\r
128 size = X_Util_Image_getActualDimension( !X_Net_Image_isElement ? this.abspath : this );
\r
129 this.timerID = this[ 'asyncDispatch' ]( {
\r
130 type : X_EVENT_SUCCESS,
\r
131 src : this.abspath,
\r
134 // TODO feedback net speed
\r
135 // time , this[ '_rawObject' ].fileSize
\r
139 case X_EVENT_KILL_INSTANCE :
\r
141 !X_Net_Image_hasImage && this[ 'kill' ](); // if xnode
\r
147 // X_Net_Image_isElement && X_NET_ImageWrapper[ 'appendAt' ]( X.X_Node_systemNode );
\r