OSDN Git Service

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