OSDN Git Service

Version 0.6.90, files & folders renamed.
[pettanr/clientJs.git] / 0.6.x / js / 04_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 X.Util.NinjaIframe = X.EventDispatcher.inherits(\r
7         'NinjaIframe',\r
8         {\r
9                 autoRefresh  : 0,\r
10                 \r
11                 xnodeIframe  : null,\r
12                 \r
13                 _iwin        : null,\r
14                 \r
15                 _html        : '',\r
16                 _name        : '',\r
17                 _ready       : false,\r
18                 \r
19                 Constructor : function( html ){\r
20                         \r
21                         this._name = 'hidden-iframe-' + X.getTime();\r
22                         // https://github.com/polygonplanet/Pot.js/blob/master/src/Worker.js\r
23 \r
24                         this.xnodeIframe = X.Dom.Node._body.create(\r
25                                 'iframe',\r
26                                 {\r
27                                         className         : 'hidden-iframe',\r
28                                         scrolling         : 'no',\r
29                                         frameborder       : 0,\r
30                                         allowtransparency : 'no',\r
31                                         name              : this._name,\r
32                                         id                : this._name\r
33                                 }\r
34                         );\r
35                         \r
36                         X.Dom.listenOnce( X.Dom.Event.AFTER_UPDATE, this );\r
37                         \r
38                         // http://nanto.asablo.jp/blog/2011/12/08/6237308\r
39                         // IE 6/7 で文書間通信を実現するための一案\r
40                         if( X.UA.IE < 9 ){\r
41                                 this.xnodeIframe.attr( 'src', 'about:blank' );\r
42                         };\r
43                         // Safari 2.0.* bug: iframe's absolute position and src set.\r
44                         if( !X.UA.Webkit ){\r
45                                 this.xnodeIframe.css( { position : 'absolute' } );\r
46                         };\r
47                         \r
48                         if( html ) this._html = html;\r
49                 },\r
50                 \r
51                 handleEvent : function( e ){\r
52                         var raw = this.xnodeIframe._rawObject,\r
53                                 html, idoc;\r
54                         \r
55                         switch( e.type ){\r
56                                 case X.Dom.Event.AFTER_UPDATE :\r
57                                         this._iwin = raw.contentWindow || raw.contentDocument && raw.contentDocument.parentWindow || window.frames[ this._name ];\r
58                                         \r
59                                         this.xnodeIframe.listen( X.UA.IE < 9 ? [ 'readystatechange', 'error' ] : [ 'load', 'error' ], this );\r
60                                         \r
61                                         if( !( X.UA.IE < 9 ) ){\r
62                                                 this._html && X_Util_NinjaIframe_writeToIframe( this );\r
63                                                 this._ready = true;\r
64                                                 return;\r
65                                         };\r
66                                         \r
67                                 case 'readystatechange' :\r
68                                         if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) return X.Callback.STOP_PROPAGATION;\r
69                                         // ie9-\r
70                                         if( !this._ready ){\r
71                                                 this._html && X_Util_NinjaIframe_writeToIframe( this );\r
72                                                 this._ready = true;\r
73                                                 return;                 \r
74                                         };\r
75                                         // onload\r
76                                 case 'load' :\r
77                                         console.log( 'iframe load.' );\r
78                                         this.asyncDispatch( 0, X.Event.SUCCESS );\r
79                                         break;\r
80                                 case 'error' :\r
81                                         this.asyncDispatch( 0, X.Event.ERROR );\r
82                                         break;\r
83                         };\r
84                         \r
85                         return X.Callback.STOP_PROPAGATION;                     \r
86                 },\r
87                 \r
88                 refresh : function( opt_html ){\r
89                         var raw = this.xnodeIframe._rawObject,\r
90                                 idoc;\r
91                                 \r
92                         this._ready = false;\r
93                         \r
94                         if( !this._iwin ){\r
95                                 this._html = opt_html;\r
96                                 return this;\r
97                         };\r
98                         \r
99                         if( X.UA.IE5 || X.UA.IE55 ){\r
100                                 this._iwin.location.href = 'about:blank'; // reload() では、IE5.5(IETester)で2回目移行の操作でerrorが出る(doc取得やopen,writeで)\r
101                         } else {\r
102                                 this._iwin.location.reload();\r
103                         };\r
104                         \r
105                         if( !opt_html ) return this;\r
106                         \r
107                         this._html = opt_html;\r
108                         X.UA.IE < 9 || X_Util_NinjaIframe_writeToIframe( this );\r
109                         \r
110                         return this;\r
111                 },\r
112                 \r
113                 close : function(){\r
114                         X.Dom.unlisten( X.Dom.Event.AFTER_UPDATE, this );\r
115                         this.xnodeIframe.call( 'close' );\r
116                         this.xnodeIframe.destroy();\r
117                 }\r
118                 \r
119         }\r
120 );\r
121 \r
122 function X_Util_NinjaIframe_writeToIframe( that ){\r
123         var raw  = that.xnodeIframe._rawObject,\r
124                 idoc = raw.contentDocument || that._iwin.document,\r
125                 html = that._html;\r
126                 \r
127         delete that._html;\r
128         that._ready = true;\r
129 \r
130         idoc.open();\r
131         idoc.writeln( html );\r
132         idoc.close();\r
133 };\r
134 \r