OSDN Git Service

Version 0.6.208, bug fixes.
[pettanr/clientJs.git] / 0.6.x / js / 05_util / 06_XWindow.js
1 /**\r
2  * 別窓(別タブ)の操作\r
3  * <ol>\r
4  * <li>ポップアップブロックされないように、pointer event, click event 内でインスタンスを作る\r
5  * <li>win.kill() で別窓を閉じる\r
6  * <li>win.kill() 以外で閉じられた場合、ユーザーの[x]ボタン操作や、他のscriptによって閉じられた場合、X.Event.UNLOAD イベントを発して自身を kill する。\r
7  * </ol>\r
8  * イベント\r
9  * <dl>\r
10  * <dt>X.Event.UNLOAD<dd>win.kill() 以外で閉じられた場合に通知、自身はkillする\r
11  * <dt>X.Event.ERROR<dd>他ドメインに遷移した等の理由で win.write() による書き換えに失敗した場合\r
12  * </dl>\r
13  * \r
14  * @example // 別ページの表示\r
15  * win = X.Util.Window( { url : 'other.html' } );\r
16  * // コンテンツの書き込み\r
17  * win = X.Util.Window( { html : '&lt;p&gt;Hello,world!&lt;/p&gt;' } );\r
18  * // 閉じる\r
19  * win.kill();\r
20  * \r
21  * @alias X.Util.Window\r
22  * @class Window 別窓(別タブ)\r
23  * @extends {EventDispatcher}\r
24  */\r
25 var X_Window = X[ 'Util' ][ 'Window' ] = X_EventDispatcher[ 'inherits' ](\r
26         'X.Window',\r
27         \r
28         /** @lends X.Util.Window.prototype */\r
29         {               \r
30                 'Constructor' : function( options ){\r
31                         var url  = options[ 'url' ],\r
32                                 page = window.open( url || ''/* 'about:blank' */, options[ 'name' ] || '', options[ 'params' ] || '' ),\r
33                                 html = options[ 'html' ],\r
34                                 doc  = X_Script_try( X_Object_find, [ page, 'document' ] );\r
35 \r
36                         X_ViewPort[ 'listenOnce' ]( X_EVENT_UNLOAD, this, X_Util_Window_handleEvent );\r
37                         this[ 'listenOnce' ]( [ X_EVENT_UNLOAD, X_EVENT_KILL_INSTANCE ], X_Util_Window_handleEvent );\r
38                         \r
39                         X_Pair_create( this, {\r
40                                 page    : page,\r
41                                 timerID : X_Timer_add( options[ 'interval' ] || 500, 0, this, X_Util_Window_onTimer )\r
42                         } );\r
43 \r
44                         if( !url && html ){\r
45                                 this[ 'write' ]( html );\r
46                         };      \r
47                 },\r
48                 \r
49                 /**\r
50                  * 別窓が閉じられたか?\r
51                  * <ol>\r
52                  * <li>ユーザーの[x]クリック操作等\r
53                  * <li>別窓内の script, または他の script\r
54                  * </ol>\r
55                  * @return {boolean}\r
56                  */\r
57                 'closed' : function(){\r
58                         var pair = X_Pair_get( this );\r
59                         \r
60                         return pair ? X_Script_try( X_Object_find, [ pair.page, 'closed' ] ) : true;\r
61                 },\r
62 \r
63                 /**\r
64                  * 別窓の url を書き換える\r
65                  * @param {string} url\r
66                  * @return {Window} チェーンメソッド\r
67                  */\r
68                 'url' : function( url ){\r
69                         var pair = X_Pair_get( this );\r
70                         \r
71                         pair && ( pair.page.location.href = url );\r
72                         return this;\r
73                 },\r
74 \r
75                 /**\r
76                  * 別窓の内容を書き換える\r
77                  * @param {string=} opt_html html文字列\r
78                  * @return {Window} チェーンメソッド\r
79                  */\r
80                 'write' : function( opt_html ){\r
81                         var pair = X_Pair_get( this ),\r
82                                 doc  = pair && X_Script_try( X_Object_find, [ pair.page, 'document' ] );\r
83 \r
84                         if( doc ){\r
85                                 doc.open();\r
86                                 doc.write( opt_html || '' ); // TODO 無毒化\r
87                                 doc.close();\r
88                         } else {\r
89                                 this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
90                         };\r
91                         \r
92                         return this;\r
93                 },\r
94 \r
95                 /**\r
96                  * 別窓の値にアクセスする, X.Object.find 参照\r
97                  * @param {string} selector 'navigator>mineTypes>hoge'\r
98                  * @return {*}\r
99                  */\r
100                 'find' : function( selector ){\r
101                         var pair = X_Pair_get( this );\r
102                         \r
103                         if( pair ) return X_Script_try( X_Object_find, [ pair.page, selector ] );\r
104                 },\r
105                 \r
106                 /**\r
107                  * 別窓にfocusする ..firefox でできない...\r
108                  * @return {Window} チェーンメソッド\r
109                  */\r
110                 'focus' : function(){\r
111                         var pair = X_Pair_get( this );\r
112                         \r
113                         pair && pair.page[ 'focus' ]();\r
114                         return this;\r
115                 }\r
116         }\r
117 );\r
118 \r
119 function X_Util_Window_onTimer( e ){\r
120         var pair = X_Pair_get( this );\r
121 \r
122         if( this[ 'closed' ]() ){\r
123                 this[ 'asyncDispatch' ]( X_EVENT_UNLOAD );\r
124                 delete pair.timerID;\r
125                 return X_CALLBACK_UN_LISTEN;\r
126         };\r
127 };\r
128 \r
129 function X_Util_Window_handleEvent( e ){\r
130         var pair = X_Pair_get( this ),\r
131                 page = pair && pair.page;\r
132 \r
133         switch( e.type ){\r
134                 case X_EVENT_UNLOAD :\r
135                         this[ 'kill' ]();\r
136                         break;\r
137                 \r
138                 case X_EVENT_KILL_INSTANCE :\r
139                         if( page && !this[ 'closed' ]() ){\r
140                                 if( 9 < X_UA[ 'IEHost' ] ){\r
141                                         page.close();\r
142                                 } else {\r
143                                         page.open( 'about:blank', '_self' ).close();\r
144                                 };\r
145                                 X_Pair_release( this, page );                           \r
146                         };\r
147                         pair.timerID && X_Timer_remove( pair.timerID );\r
148                         X_ViewPort[ 'unlisten' ]( X_EVENT_UNLOAD, this, X_Util_Window_handleEvent );\r
149                         break;\r
150         };\r
151 };\r
152 \r