OSDN Git Service

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