-/*\r
+/**\r
* http://msdn.microsoft.com/ja-jp/library/ie/hh180174%28v=vs.85%29.aspx\r
* 孤立するとウィンドウ オブジェクトのプロパティが消去される\r
+ * \r
+ * http://qiita.com/sou/items/3380d4fa9b08b27bb387\r
+ * モバイルブラウザでの iframe の挙動(Mobile Safari, Chrome for Android)\r
+ * \r
+ * @alias X.Util.NinjaIframe\r
+ * @class 隠し iframe 機能を提供します。\r
+ * @constructor \r
+ * @constructs NinjaIframe\r
+ * @extends {Node}\r
*/\r
-\r
-// TODO Node.inherits\r
-X.Util.NinjaIframe = X.EventDispatcher.inherits(\r
+var X_NinjaIframe = X[ 'Util' ][ 'NinjaIframe' ] = Node[ 'inherits' ](\r
'NinjaIframe',\r
{\r
autoRefresh : 0,\r
\r
- xnodeIframe : null,\r
- \r
_iwin : null,\r
\r
- _html : '',\r
+ _contentHTML : '',\r
_name : '',\r
_ready : false,\r
\r
- Constructor : function( html ){\r
+ 'Constructor' : function( html ){\r
\r
this._name = 'hidden-iframe-' + X_Timer_now();\r
// https://github.com/polygonplanet/Pot.js/blob/master/src/Worker.js\r
\r
- this.xnodeIframe = X_Node_body.create(\r
- 'iframe',\r
+ X_Node_newByTag = true;\r
+\r
+ this[ 'Super' ](\r
+ 'IFRAME',\r
{\r
className : 'hidden-iframe',\r
scrolling : 'no',\r
}\r
);\r
\r
- X.ViewPort.listenOnce( X.Event.AFTER_UPDATE, this );\r
- \r
// http://nanto.asablo.jp/blog/2011/12/08/6237308\r
// IE 6/7 で文書間通信を実現するための一案\r
- if( X_UA.IE < 9 ){\r
- this.xnodeIframe.attr( 'src', 'about:blank' );\r
+ if( X_UA[ 'IE' ] < 9 ){\r
+ this[ 'attr' ]( 'src', 'about:blank' );\r
};\r
// Safari 2.0.* bug: iframe's absolute position and src set.\r
- if( !X_UA.Webkit ){\r
- this.xnodeIframe.css( { position : 'absolute' } );\r
+ if( !X_UA[ 'Webkit' ] ){\r
+ this[ 'css' ]( { position : 'absolute' } );\r
};\r
\r
- if( html ) this._html = html;\r
- },\r
- \r
- handleEvent : function( e ){\r
- var raw = this.xnodeIframe._rawObject,\r
- html, idoc;\r
+ if( html ) this._contentHTML = html; \r
\r
- switch( e.type ){\r
- case X.Event.AFTER_UPDATE :\r
- this._iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ this._name ];\r
- // http://d.hatena.ne.jp/NeoCat/20080921/1221940658\r
- // こちらに名前をsetしないとtargetが動作しない\r
- this._iwin.name = this._name;\r
- \r
- this.xnodeIframe.listen( [ X_UA.IE < 9 ? 'readystatechange' : 'load', 'error' ], this );\r
- \r
- if( !( X_UA.IE < 9 ) ){\r
- this._html && X_Util_NinjaIframe_writeToIframe( this );\r
- this._ready = true;\r
- return;\r
- };\r
- \r
- case 'readystatechange' :\r
- if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) return X.Callback.STOP_PROPAGATION;\r
- // ie9-\r
- if( !this._ready ){\r
- this._html && X_Util_NinjaIframe_writeToIframe( this );\r
- this._ready = true;\r
- return;\r
- };\r
- // onload\r
- case 'load' :\r
- console.log( 'iframe load.' );\r
- this.asyncDispatch( X.Event.SUCCESS );\r
- break;\r
- case 'error' :\r
- this.asyncDispatch( X.Event.ERROR );\r
- break;\r
- };\r
+ this[ 'appendTo' ]( X_Node_body /* X_Node_systemNode */ )\r
+ [ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_Util_NinjaIframe_handleEvent );\r
\r
- return X.Callback.STOP_PROPAGATION; \r
+ X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );\r
},\r
\r
- refresh : function( opt_html ){\r
- var raw = this.xnodeIframe._rawObject,\r
+ 'refresh' : function( opt_contentHTML ){\r
+ var raw = this[ '_rawObject' ],\r
idoc;\r
\r
this._ready = false;\r
\r
if( !this._iwin ){\r
- this._html = opt_html;\r
+ this._contentHTML = opt_contentHTML;\r
return this;\r
};\r
\r
- if( X_UA.IE5 || X_UA.IE55 ){\r
+ if( X_UA[ 'IE5x' ] ){\r
this._iwin.location.href = 'about:blank'; // reload() では、IE5.5(IETester)で2回目移行の操作でerrorが出る(doc取得やopen,writeで)\r
} else {\r
this._iwin.location.reload();\r
};\r
\r
- if( !opt_html ) return this;\r
+ if( !opt_contentHTML && opt_contentHTML !== '' ) return this;\r
\r
- this._html = opt_html;\r
- X_UA.IE < 9 || X_Util_NinjaIframe_writeToIframe( this );\r
+ this._contentHTML = opt_contentHTML;\r
+\r
+ if( !( X_UA[ 'IE' ] < 9 ) ){\r
+ X_Util_NinjaIframe_writeToIframe( this );\r
+ this._ready = true;\r
+ };\r
\r
return this;\r
- },\r
- \r
- close : function(){\r
- X_ViewPort.unlisten( X.Event.AFTER_UPDATE, this );\r
- this.xnodeIframe.call( 'close' );\r
- this.xnodeIframe.destroy();\r
}\r
\r
}\r
);\r
\r
+\r
+function X_Util_NinjaIframe_handleEvent( e ){\r
+ var raw = this[ '_rawObject' ];\r
+ \r
+ switch( e.type ){\r
+ case X_EVENT_AFTER_UPDATE :\r
+ this._iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ this._name ];\r
+ // http://d.hatena.ne.jp/NeoCat/20080921/1221940658\r
+ // こちらに名前をsetしないとtargetが動作しない\r
+ if( X_UA[ 'IE' ] ) this._iwin.name = this._name;\r
+ \r
+ this[ 'listen' ]( [ X_UA[ 'IE' ] < 9 ? 'readystatechange' : 'load', 'error' ], this, X_Util_NinjaIframe_handleEvent );\r
+ \r
+ if( !( X_UA[ 'IE' ] < 9 ) ){\r
+ ( this._contentHTML || this._contentHTML === '' ) && X_Util_NinjaIframe_writeToIframe( this );\r
+ this._ready = true;\r
+ return;\r
+ };\r
+ //break; これあると IE8 で駄目!\r
+ \r
+ case 'readystatechange' :\r
+ if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) break;\r
+ // ie9-\r
+ if( !this._ready ){\r
+ ( this._contentHTML || this._contentHTML === '' ) && X_Util_NinjaIframe_writeToIframe( this );\r
+ this._ready = true;\r
+ break;\r
+ };\r
+ // onload\r
+ case 'load' :\r
+ console.log( 'iframe load.' );\r
+ this[ 'asyncDispatch' ]( 'ninjaload' );\r
+ break;\r
+\r
+ case 'error' :\r
+ this[ 'asyncDispatch' ]( 'ninjaerror' );\r
+ break;\r
+ \r
+ case X_EVENT_KILL_INSTANCE :\r
+ X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );\r
+ this._iwin && this._iwin.close();\r
+ break;\r
+ };\r
+ \r
+ return X_CALLBACK_STOP_PROPAGATION;\r
+};\r
+\r
function X_Util_NinjaIframe_writeToIframe( that ){\r
- var raw = that.xnodeIframe._rawObject,\r
+ var raw = that[ '_rawObject' ],\r
idoc = raw.contentDocument || that._iwin.document,\r
- html = that._html;\r
- \r
- delete that._html;\r
- that._ready = true;\r
+ html = that._contentHTML;\r
+ \r
+ that._ready = true; // これを削除すると ie6,7,8 で Stack overflow at line : 0 意味不明\r
+ delete that._contentHTML;\r
\r
idoc.open();\r
idoc.writeln( html );\r