2 * http://msdn.microsoft.com/ja-jp/library/ie/hh180174%28v=vs.85%29.aspx
\r
3 * 孤立するとウィンドウ オブジェクトのプロパティが消去される
\r
5 * http://qiita.com/sou/items/3380d4fa9b08b27bb387
\r
6 * モバイルブラウザでの iframe の挙動(Mobile Safari, Chrome for Android)
\r
8 * @alias X.Util.NinjaIframe
\r
9 * @class NinjaIframe 隠し iframe 機能を提供します。
\r
12 var X_NinjaIframe = X[ 'Util' ][ 'NinjaIframe' ] = Node[ 'inherits' ](
\r
15 /** @lends NinjaIframe.prototype */
\r
17 /* autoRefresh : 0, */
\r
20 * iframe の contentWindow
\r
26 * iframe に write する html 文字時列
\r
37 * iframe への html 文字列の write が完了した
\r
42 'Constructor' : function( html ){
\r
45 this._name = 'hidden-iframe-' + X_Timer_now();
\r
46 // https://github.com/polygonplanet/Pot.js/blob/master/src/Worker.js
\r
48 X_Node_newByTag = true;
\r
53 className : 'hidden-iframe',
\r
55 allowtransparency : 'no',
\r
63 // http://nanto.asablo.jp/blog/2011/12/08/6237308
\r
64 // IE 6/7 で文書間通信を実現するための一案
\r
65 if( X_UA[ 'IE' ] < 9 ){
\r
66 this[ 'attr' ]( 'src', 'about:blank' );
\r
68 // Safari 2.0.* bug: iframe's absolute position and src set.
\r
69 if( !X_UA[ 'Webkit' ] ){
\r
70 this[ 'css' ]( { position : 'absolute' } );
\r
73 if( html ) this._contentHTML = html;
\r
75 this[ 'appendTo' ]( X_Node_systemNode )
\r
76 [ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_Util_NinjaIframe_handleEvent );
\r
78 X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );
\r
82 * iframe 内をリフレッシュ、または内容を上書きする
\r
83 * @param {string=} opt_contentHTML html文字列
\r
84 * @return {NinjaIframe} チェーンメソッド
\r
86 'refresh' : function( opt_contentHTML ){
\r
87 var raw = this[ '_rawObject' ],
\r
90 this._ready = false;
\r
93 this._contentHTML = opt_contentHTML;
\r
97 if( X_UA[ 'IE5x' ] ){
\r
98 this._iwin.location.href = 'about:blank'; // reload() では、IE5.5(IETester)で2回目移行の操作でerrorが出る(doc取得やopen,writeで)
\r
100 this._iwin.location.reload();
\r
103 if( !X_Type_isString( opt_contentHTML ) ) return this;
\r
105 this._contentHTML = opt_contentHTML;
\r
107 if( !( X_UA[ 'IE' ] < 9 ) ){
\r
108 X_Util_NinjaIframe_writeToIframe( this );
\r
118 function X_Util_NinjaIframe_handleEvent( e ){
\r
119 var raw = this[ '_rawObject' ];
\r
122 case X_EVENT_AFTER_UPDATE :
\r
123 this._iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ this._name ];
\r
124 // http://d.hatena.ne.jp/NeoCat/20080921/1221940658
\r
125 // こちらに名前をsetしないとtargetが動作しない
\r
126 if( X_UA[ 'IE' ] ) this._iwin.name = this._name;
\r
128 this[ 'listen' ]( X_UA[ 'IE' ] < 9 ? 'readystatechange' : [ 'load', 'error' ], X_Util_NinjaIframe_handleEvent );
\r
130 if( !( X_UA[ 'IE' ] < 9 ) ){
\r
131 X_Util_NinjaIframe_writeToIframe( this );
\r
134 //break; これあると IE8 で駄目!
\r
136 case 'readystatechange' :
\r
137 if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) break;
\r
139 if( !this._ready ){
\r
140 X_Util_NinjaIframe_writeToIframe( this );
\r
145 console.log( 'iframe load.' );
\r
146 this[ 'asyncDispatch' ]( 'ninjaload' );
\r
150 this[ 'asyncDispatch' ]( 'ninjaerror' );
\r
153 case X_EVENT_KILL_INSTANCE :
\r
154 X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );
\r
155 this._iwin && this._iwin.close();
\r
159 return X_CALLBACK_STOP_PROPAGATION;
\r
162 function X_Util_NinjaIframe_writeToIframe( that ){
\r
163 var raw = that[ '_rawObject' ],
\r
164 idoc = raw.contentDocument || that._iwin.document,
\r
165 html = that._contentHTML;
\r
167 that._ready = true; // これを削除すると ie6,7,8 で Stack overflow at line : 0 意味不明 'readystatechange' が繰り返し起こりループする??
\r
168 delete that._contentHTML;
\r
171 idoc.writeln( html );
\r