OSDN Git Service

63174a47ff134f327fd0d22e86be1f0cc2072426
[pettanr/clientJs.git] / 0.6.x / js / 06_net / 04_XNetImage.js
1 //{+netimage"画像の読み込み監視"(Imageの読み込みを監視し画像表示のコントロールを行う)[+net,+utilimage]\r
2 /* \r
3  * original\r
4  *  LICENSE: MIT?\r
5  *  URL: http://d.hatena.ne.jp/uupaa/20080413/1208067631\r
6  *  AUTHOR: uupaa.js@gmail.com\r
7  * \r
8  */\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
13 \r
14 /*\r
15  * TODO\r
16  * new Image() のときに Image オブジェクトを作るもの(IE8-)と、HTMLImageElement を作るものがある。\r
17  * Image は、X.EventDispatcher で、<img> は X.Node で。 \r
18  */\r
19 \r
20 X_TEMP.X_NET_Image_init = function(){\r
21         X_NET_ImageWrapper = X_Class_override(\r
22                 X_Net_Image_isElement ? Node( X_Net_Image_image ) : X_EventDispatcher( X_Net_Image_image ),\r
23                 X_TEMP.X_NET_Image_params\r
24         );\r
25         \r
26         X_NET_ImageWrapper[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_NET_Image_handleEvent );\r
27         \r
28         delete X_TEMP.X_NET_Image_init;\r
29         delete X_TEMP.X_NET_Image_params;       \r
30         \r
31         return X_NET_ImageWrapper;\r
32 };\r
33 \r
34 X_TEMP.X_NET_Image_params = {\r
35                 _busy      : false,\r
36                 tick       : 0,\r
37                 timerID    : 0,\r
38                 finish     : false,\r
39                 abspath    : '',\r
40                 delay      : 0,\r
41                 timeout    : 0,\r
42                 \r
43                 load : function( data ){\r
44                         this._busy   = true;\r
45                         this.abspath = X_URL_toAbsolutePath( data[ 'url' ] );\r
46                         this.delay   = data[ 'delay'   ] || 100;\r
47                         this.timeout = data[ 'timeout' ] || 5000;\r
48 \r
49                         this[ '_rawObject' ].src = this.abspath;\r
50 \r
51                         if( X_UA[ 'Opera7' ] && this[ '_rawObject' ].complete ){\r
52                                 this[ 'asyncDispatch' ]( 'load' );\r
53                         } else {\r
54                                 this.timerID = X_Timer_add( this.delay, 0, this, X_NET_Image_detect );\r
55                         };\r
56                 },\r
57                 \r
58                 cancel : function(){\r
59                         var raw = this[ '_rawObject' ];\r
60                         // abort がある?\r
61                         raw && raw.abort && raw.abort();\r
62                         // this[ '_rawObject' ].src = '';\r
63                         this._busy  = false;\r
64                         this.finish = true;\r
65                 },\r
66                 \r
67                 reset : function(){\r
68                         console.log( 'X.Net.Image:reset ' + this.abspath + ' timerID:' + this.timerID );\r
69                         \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
73                         this.timerID  = 0;\r
74                         this._busy    = false;\r
75                         this.finished = false;\r
76                         this.abspath  = '';\r
77                 }\r
78         };\r
79 \r
80 function X_NET_Image_detect(){\r
81         var raw = this[ '_rawObject' ];\r
82         \r
83         if( this.finish ) return;\r
84         if( raw && raw.complete ){\r
85                 this._busy  = false;\r
86                 this.finish = true;\r
87                 console.log( 'X.Net.Image:detect ' + raw.width );\r
88                 if( raw.width ) return;\r
89                 X_Timer_remove( this.timerID );\r
90                 this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
91         } else\r
92         if( this.timeout < ( this.tick += this.delay ) ){\r
93                 this._busy  = false;\r
94                 this.finish = true;\r
95                 X_Timer_remove( this.timerID );\r
96                 this.timerID = this[ 'asyncDispatch' ]( { type : X_EVENT_ERROR, 'timeout' : true } );\r
97         };\r
98 };\r
99 \r
100 function X_NET_Image_handleEvent( e ){\r
101         var size;\r
102         \r
103         console.log( 'X.Net.Image:handleEvent ' + e.type );\r
104         \r
105         switch( e.type ){\r
106                 case 'error' :\r
107                 //case 'abort' : // TODO ??\r
108                         if( this.finish ) return;\r
109                         this._busy  = false;\r
110                         this.finish  = true;\r
111                         this.timerID && X_Timer_remove( this.timerID );\r
112                         this.timerID = this[ 'asyncDispatch' ]( /*e.type === 'error' ?*/ X_EVENT_ERROR /*: X_EVENT_CANCELED*/ );\r
113                         break;\r
114 \r
115                 case 'load' :\r
116                 // if( finish === true ) return; // これがあると firefox3.6 で駄目、、、\r
117                 // if( timer ) return; // これがあると safari3.2 で駄目、、、\r
118                         this._busy  = false;\r
119                         this.finish = true;\r
120                         this.timerID && X_Timer_remove( this.timerID );\r
121                         if( X_UA[ 'Opera' ] && !this[ '_rawObject' ].complete ){\r
122                                 this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
123                                 return;\r
124                         };\r
125 \r
126                         size = X_Util_Image_getActualDimension( !X_Net_Image_isElement ? this.abspath : this );\r
127                         this.timerID = this[ 'asyncDispatch' ]( {\r
128                                 'type' : X_EVENT_SUCCESS,\r
129                                 'src'  : this.abspath,\r
130                                 'w'    : size[ 0 ],\r
131                                 'h'    : size[ 1 ]\r
132                                 // TODO feedback net speed\r
133                                 // time , this[ '_rawObject' ].fileSize\r
134                         } );\r
135                         break;\r
136 \r
137                 case X_EVENT_KILL_INSTANCE :\r
138                         this.reset();\r
139                         break;\r
140         };\r
141 };\r
142 \r
143 \r
144 // X_Net_Image_isElement && X_NET_ImageWrapper[ 'appendAt' ]( X.X_Node_systemNode );\r