* \r
* @alias X.Util.NinjaIframe\r
* @class NinjaIframe 隠し iframe 機能を提供します。\r
- * @constructs NinjaIframe\r
* @extends {Node}\r
*/\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
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
\r
if( !( X_UA[ 'IE' ] < 9 ) ){\r
X_Util_NinjaIframe_writeToIframe( this );\r
- //this._ready = true;\r
};\r
\r
return this;\r
\r
if( !( X_UA[ 'IE' ] < 9 ) ){\r
X_Util_NinjaIframe_writeToIframe( this );\r
- //this._ready = true;\r
return;\r
};\r
//break; これあると IE8 で駄目!\r
// ie9-\r
if( !this._ready ){\r
X_Util_NinjaIframe_writeToIframe( this );\r
- //this._ready = true;\r
break;\r
};\r
// onload\r
idoc = raw.contentDocument || that._iwin.document,\r
html = that._contentHTML;\r
\r
- that._ready = true; // これを削除すると ie6,7,8 で Stack overflow at line : 0 意味不明\r
+ that._ready = true; // これを削除すると ie6,7,8 で Stack overflow at line : 0 意味不明 'readystatechange' が繰り返し起こりループする??\r
delete that._contentHTML;\r
\r
idoc.open();\r
--- /dev/null
+/**\r
+ * 別窓(別タブ)の操作\r
+ * <ol>\r
+ * <li>win.kill() で別窓を閉じる\r
+ * <li>win.kill() 以外で閉じられた場合、ユーザーの[x]ボタン操作や、他のscriptによって閉じられた場合、X.Event.UNLOAD イベントを発して自身を kill する。\r
+ * </ol>\r
+ * イベント\r
+ * <dl>\r
+ * <dt>X.Event.UNLOAD<dd>win.kill() 以外で閉じられた場合に通知、自身はkillする\r
+ * <dt>X.Event.ERROR<dd>他ドメインに遷移した等の理由で win.write() による書き換えに失敗した場合\r
+ * </dl>\r
+ * \r
+ * @example // 別ページの表示\r
+ * win = X.Util.Window( { url : 'other.html' } );\r
+ * // コンテンツの書き込み\r
+ * win = X.Util.Window( { html : '<p>Hello,world!</p>' } );\r
+ * // 閉じる\r
+ * win.kill();\r
+ * \r
+ * @alias X.Util.Window\r
+ * @class Window 別窓(別タブ)\r
+ * @extends {EventDispatcher}\r
+ */\r
+var X_Window = X[ 'Util' ][ 'Window' ] = X_EventDispatcher[ 'inherits' ](\r
+ 'X.Window',\r
+ \r
+ /** @lends X.Util.Window.prototype */\r
+ {\r
+ \r
+ // TODO pair 側に\r
+ /**\r
+ * closed の監視用タイマーID\r
+ * @private\r
+ * @type {number} */\r
+ _timerID : 0,\r
+ \r
+ 'Constructor' : function( options ){\r
+ var url = options[ 'url' ],\r
+ page = window.open( url || ''/* 'about:blank' */, options[ 'name' ] || '', options[ 'params' ] || '' ),\r
+ html = options[ 'html' ],\r
+ doc = X_Script_try( X_Object_find, [ page, 'document' ] );\r
+ \r
+ X_Pair_create( this, page );\r
+ \r
+ if( !url && html ){\r
+ this[ 'write' ]( html );\r
+ };\r
+ \r
+ X_ViewPort[ 'listenOnce' ]( X_EVENT_UNLOAD, this, X_Util_Window_handleEvent );\r
+ this[ 'listenOnce' ]( [ X_EVENT_UNLOAD, X_EVENT_KILL_INSTANCE ], X_Util_Window_handleEvent );\r
+ \r
+ this._timerID = X_Timer_add( options[ 'interval' ] || 500, 0, this, X_Util_Window_onTimer );\r
+ },\r
+ \r
+ /**\r
+ * 別窓が閉じられたか?\r
+ * <ol>\r
+ * <li>ユーザーの[x]クリック操作等\r
+ * <li>別窓内の script, または他の script\r
+ * </ol>\r
+ * @return {boolean}\r
+ */\r
+ 'closed' : function(){\r
+ return X_Script_try( X_Object_find, [ X_Pair_get( this ), 'closed' ] );\r
+ },\r
+ \r
+ /**\r
+ * 別窓の内容を書き換える\r
+ * @param {string=} opt_html html文字列\r
+ * @return {Window} チェーンメソッド\r
+ */\r
+ 'write' : function( opt_html ){\r
+ var doc = X_Script_try( X_Object_find, [ X_Pair_get( this ), 'document' ] );\r
+\r
+ if( doc ){\r
+ doc.open();\r
+ doc.write( opt_html || '' ); // TODO 無毒化\r
+ doc.close();\r
+ } else {\r
+ this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
+ };\r
+ \r
+ return this;\r
+ }\r
+ \r
+ // TODO url\r
+ \r
+ }\r
+);\r
+\r
+function X_Util_Window_onTimer( e ){\r
+ if( this[ 'closed' ]() ){\r
+ this[ 'asyncDispatch' ]( X_EVENT_UNLOAD );\r
+ delete this._timerID;\r
+ return X_CALLBACK_UN_LISTEN;\r
+ };\r
+};\r
+\r
+function X_Util_Window_handleEvent( e ){\r
+ var page = X_Pair_get( this );\r
+\r
+ switch( e.type ){\r
+ case X_EVENT_UNLOAD :\r
+ this[ 'kill' ]();\r
+ break;\r
+ \r
+ case X_EVENT_KILL_INSTANCE :\r
+ if( page && !this[ 'closed' ]() ){\r
+ if( 9 < X_UA[ 'IEHost' ] ){\r
+ page.close();\r
+ } else {\r
+ page.open( 'about:blank', '_self' ).close();\r
+ };\r
+ X_Pair_release( this, page ); \r
+ };\r
+ this._timerID && X_Timer_remove( this._timerID );\r
+ X_ViewPort[ 'unlisten' ]( X_EVENT_UNLOAD, this, X_Util_Window_handleEvent );\r
+ break;\r
+ };\r
+};\r
+\r