-/*\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 NinjaIframe 隠し iframe 機能を提供します。\r
+ * @extends {Node}\r
*/\r
-\r
-// TODO Node.inherits\r
-X[ 'Util' ][ 'NinjaIframe' ] = Node[ 'inherits' ](\r
+var X_NinjaIframe = X[ 'Util' ][ 'NinjaIframe' ] = Node[ 'inherits' ](\r
'NinjaIframe',\r
+ \r
+ /** @lends NinjaIframe.prototype */\r
{\r
- autoRefresh : 0,\r
+ /* autoRefresh : 0, */\r
\r
+ /**\r
+ * iframe の contentWindow\r
+ * @private\r
+ * @type {window} */\r
_iwin : null,\r
\r
+ /**\r
+ * iframe に write する html 文字時列\r
+ * @type {string} */\r
_contentHTML : '',\r
+ \r
+ /**\r
+ * iframe の name\r
+ * @private\r
+ * @type {string} */\r
_name : '',\r
+ \r
+ /**\r
+ * iframe への html 文字列の write が完了した\r
+ * @private\r
+ * @type {string} */\r
_ready : false,\r
\r
'Constructor' : function( html ){\r
+ // TODO src も設定可能に\r
\r
this._name = 'hidden-iframe-' + X_Timer_now();\r
// https://github.com/polygonplanet/Pot.js/blob/master/src/Worker.js\r
\r
if( html ) this._contentHTML = html; \r
\r
- this[ 'appendTo' ]( X_Node_body /* X_Node_systemNode */ );\r
+ this[ 'appendTo' ]( X_Node_systemNode )\r
+ [ 'listenOnce' ]( X_EVENT_KILL_INSTANCE, X_Util_NinjaIframe_handleEvent );\r
\r
X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );\r
},\r
\r
+ /**\r
+ * iframe 内をリフレッシュ、または内容を上書きする\r
+ * @param {string=} opt_contentHTML html文字列\r
+ * @return {NinjaIframe} チェーンメソッド\r
+ */\r
'refresh' : function( opt_contentHTML ){\r
var raw = this[ '_rawObject' ],\r
idoc;\r
this._iwin.location.reload();\r
};\r
\r
- if( !opt_contentHTML && opt_contentHTML !== '' ) return this;\r
+ if( !X_Type_isString( opt_contentHTML ) ) return this;\r
\r
this._contentHTML = opt_contentHTML;\r
- X_UA[ 'IE' ] < 9 || X_Util_NinjaIframe_writeToIframe( this );\r
+\r
+ if( !( X_UA[ 'IE' ] < 9 ) ){\r
+ X_Util_NinjaIframe_writeToIframe( this );\r
+ };\r
\r
return this;\r
- },\r
- \r
- 'close' : function(){\r
- X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );\r
- this.call( 'close' );\r
- this[ 'kill' ]();\r
}\r
\r
}\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
+ this[ 'listen' ]( X_UA[ 'IE' ] < 9 ? 'readystatechange' : [ 'load', 'error' ], 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
+ X_Util_NinjaIframe_writeToIframe( this );\r
return;\r
};\r
//break; これあると IE8 で駄目!\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
+ X_Util_NinjaIframe_writeToIframe( this );\r
break;\r
};\r
// onload\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
+ return X_CALLBACK_STOP_PROPAGATION;\r
};\r
\r
function X_Util_NinjaIframe_writeToIframe( that ){\r
var raw = that[ '_rawObject' ],\r
idoc = raw.contentDocument || that._iwin.document,\r
html = that._contentHTML;\r
- \r
+ \r
+ that._ready = true; // これを削除すると ie6,7,8 で Stack overflow at line : 0 意味不明 'readystatechange' が繰り返し起こりループする??\r
delete that._contentHTML;\r
- that._ready = true;\r
\r
idoc.open();\r
idoc.writeln( html );\r