2 * http://msdn.microsoft.com/ja-jp/library/ie/hh180174%28v=vs.85%29.aspx
\r
3 * 孤立するとウィンドウ オブジェクトのプロパティが消去される
\r
6 X.Util.NinjaIframe = X.EventDispatcher.inherits(
\r
19 Constructor : function( html ){
\r
21 this._name = 'hidden-iframe-' + X_Timer_now();
\r
22 // https://github.com/polygonplanet/Pot.js/blob/master/src/Worker.js
\r
24 this.xnodeIframe = X.Dom.Node._body.create(
\r
27 className : 'hidden-iframe',
\r
30 allowtransparency : 'no',
\r
36 X.Dom.listenOnce( X.Dom.Event.AFTER_UPDATE, this );
\r
38 // http://nanto.asablo.jp/blog/2011/12/08/6237308
\r
39 // IE 6/7 で文書間通信を実現するための一案
\r
41 this.xnodeIframe.attr( 'src', 'about:blank' );
\r
43 // Safari 2.0.* bug: iframe's absolute position and src set.
\r
45 this.xnodeIframe.css( { position : 'absolute' } );
\r
48 if( html ) this._html = html;
\r
51 handleEvent : function( e ){
\r
52 var raw = this.xnodeIframe._rawObject,
\r
56 case X.Dom.Event.AFTER_UPDATE :
\r
57 this._iwin = raw.contentWindow || raw.contentDocument && raw.contentDocument.parentWindow || window.frames[ this._name ];
\r
59 this.xnodeIframe.listen( X.UA.IE < 9 ? [ 'readystatechange', 'error' ] : [ 'load', 'error' ], this );
\r
61 if( !( X.UA.IE < 9 ) ){
\r
62 this._html && X_Util_NinjaIframe_writeToIframe( this );
\r
67 case 'readystatechange' :
\r
68 if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) return X.Callback.STOP_PROPAGATION;
\r
71 this._html && X_Util_NinjaIframe_writeToIframe( this );
\r
77 console.log( 'iframe load.' );
\r
78 this.asyncDispatch( 0, X.Event.SUCCESS );
\r
81 this.asyncDispatch( 0, X.Event.ERROR );
\r
85 return X.Callback.STOP_PROPAGATION;
\r
88 refresh : function( opt_html ){
\r
89 var raw = this.xnodeIframe._rawObject,
\r
92 this._ready = false;
\r
95 this._html = opt_html;
\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
102 this._iwin.location.reload();
\r
105 if( !opt_html ) return this;
\r
107 this._html = opt_html;
\r
108 X.UA.IE < 9 || X_Util_NinjaIframe_writeToIframe( this );
\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
122 function X_Util_NinjaIframe_writeToIframe( that ){
\r
123 var raw = that.xnodeIframe._rawObject,
\r
124 idoc = raw.contentDocument || that._iwin.document,
\r
128 that._ready = true;
\r
131 idoc.writeln( html );
\r