OSDN Git Service

Version 0.6.137, bugfix for X.NodeSelector.
[pettanr/clientJs.git] / 0.6.x / js / 05_util / 01_XNinjaIframe.js
1 /*\r
2  * http://msdn.microsoft.com/ja-jp/library/ie/hh180174%28v=vs.85%29.aspx\r
3  * 孤立するとウィンドウ オブジェクトのプロパティが消去される\r
4  */\r
5 \r
6 // TODO Node.inherits\r
7 X[ 'Util' ][ 'NinjaIframe' ] = X_EventDispatcher[ 'inherits' ](\r
8         'NinjaIframe',\r
9         {\r
10                 autoRefresh  : 0,\r
11                 \r
12                 xnodeIframe  : null,\r
13                 \r
14                 _iwin        : null,\r
15                 \r
16                 _contentHTML : '',\r
17                 _name        : '',\r
18                 _ready       : false,\r
19                 \r
20                 'Constructor' : function( html ){\r
21                         \r
22                         this._name = 'hidden-iframe-' + X_Timer_now();\r
23                         // https://github.com/polygonplanet/Pot.js/blob/master/src/Worker.js\r
24 \r
25                         this.xnodeIframe = X_Node_body[ 'create' ](\r
26                                 'iframe',\r
27                                 {\r
28                                         className         : 'hidden-iframe',\r
29                                         scrolling         : 'no',\r
30                                         allowtransparency : 'no',                                       \r
31                                         frameborder       : 0,\r
32                                         tabindex          : -1,\r
33                                         name              : this._name,\r
34                                         id                : this._name\r
35                                 }\r
36                         );\r
37                         \r
38                         X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this );\r
39                         \r
40                         // http://nanto.asablo.jp/blog/2011/12/08/6237308\r
41                         // IE 6/7 で文書間通信を実現するための一案\r
42                         if( X_UA[ 'IE' ] < 9 ){\r
43                                 this.xnodeIframe[ 'attr' ]( 'src', 'about:blank' );\r
44                         };\r
45                         // Safari 2.0.* bug: iframe's absolute position and src set.\r
46                         if( !X_UA[ 'Webkit' ]  ){\r
47                                 this.xnodeIframe[ 'css' ]( { position : 'absolute' } );\r
48                         };\r
49                         \r
50                         if( html ) this._contentHTML = html;\r
51                 },\r
52                 \r
53                 'handleEvent' : function( e ){\r
54                         var raw = this.xnodeIframe[ '_rawObject' ];\r
55                         \r
56                         switch( e.type ){\r
57                                 case X_EVENT_AFTER_UPDATE :\r
58                                         this._iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ this._name ];\r
59                                         // http://d.hatena.ne.jp/NeoCat/20080921/1221940658\r
60                                         // こちらに名前をsetしないとtargetが動作しない\r
61                                         if( X_UA[ 'IE' ] ) this._iwin.name = this._name;\r
62                                         \r
63                                         this.xnodeIframe[ 'listen' ]( [ X_UA[ 'IE' ] < 9 ? 'readystatechange' : 'load', 'error' ], this );\r
64                                         \r
65                                         if( !( X_UA[ 'IE' ] < 9 ) ){\r
66                                                 this._contentHTML && X_Util_NinjaIframe_writeToIframe( this );\r
67                                                 this._ready = true;\r
68                                                 return;\r
69                                         };\r
70                                         //break; これあると IE8 で駄目!\r
71                                         \r
72                                 case 'readystatechange' :\r
73                                         if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) break;\r
74                                         // ie9-\r
75                                         if( !this._ready ){\r
76                                                 this._contentHTML && X_Util_NinjaIframe_writeToIframe( this );\r
77                                                 this._ready = true;\r
78                                                 break;\r
79                                         };\r
80                                         // onload\r
81                                 case 'load' :\r
82                                         console.log( 'iframe load.' );\r
83                                         this[ 'asyncDispatch' ]( X_EVENT_SUCCESS );\r
84                                         break;\r
85 \r
86                                 case 'error' :\r
87                                         this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
88                                         break;\r
89                         };\r
90                         \r
91                         return X_Callback_STOP_PROPAGATION;                     \r
92                 },\r
93                 \r
94                 'refresh' : function( opt_contentHTML ){\r
95                         var raw = this.xnodeIframe[ '_rawObject' ],\r
96                                 idoc;\r
97                                 \r
98                         this._ready = false;\r
99                         \r
100                         if( !this._iwin ){\r
101                                 this._contentHTML = opt_contentHTML;\r
102                                 return this;\r
103                         };\r
104                         \r
105                         if( X_UA[ 'IE5x' ] ){\r
106                                 this._iwin.location.href = 'about:blank'; // reload() では、IE5.5(IETester)で2回目移行の操作でerrorが出る(doc取得やopen,writeで)\r
107                         } else {\r
108                                 this._iwin.location.reload();\r
109                         };\r
110                         \r
111                         if( !opt_contentHTML ) return this;\r
112                         \r
113                         this._contentHTML = opt_contentHTML;\r
114                         X_UA[ 'IE' ] < 9 || X_Util_NinjaIframe_writeToIframe( this );\r
115                         \r
116                         return this;\r
117                 },\r
118                 \r
119                 'close' : function(){\r
120                         X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, this );\r
121                         this.xnodeIframe.call( 'close' );\r
122                         this.xnodeIframe.destroy();\r
123                 }\r
124                 \r
125         }\r
126 );\r
127 \r
128 function X_Util_NinjaIframe_writeToIframe( that ){\r
129         var raw  = that.xnodeIframe[ '_rawObject' ],\r
130                 idoc = raw.contentDocument || that._iwin.document,\r
131                 html = that._contentHTML;\r
132                 \r
133         delete that._contentHTML;\r
134         that._ready = true;\r
135 \r
136         idoc.open();\r
137         idoc.writeln( html );\r
138         idoc.close();\r
139 };\r
140 \r