OSDN Git Service

fffe714a16b956c04cbd4703afbe49f3c736951f
[pettanr/clientJs.git] / 0.6.x / js / 06_net / 03_XNetForm.js
1 //{+netform"<form>によるGETとPOST"(動的に生成したフォームによるGETとPOST。)[+net,+ninjaiframe]\r
2 \r
3 X[ 'Net' ][ 'Form' ] = {\r
4         // 隠し iframe 使用の可否\r
5 };\r
6 \r
7 var X_NET_Form_errorTimerID, X_Net_Form_onloadCount = 0;\r
8 \r
9 X_TEMP.X_NET_Form_init = function(){\r
10         X_NET_FormWrapper = X_Class_override( X[ 'Util' ][ 'NinjaIframe' ](), X_TEMP.X_NET_Form_params );\r
11         \r
12         delete X_TEMP.X_NET_Form_init;\r
13         delete X_TEMP.X_NET_Form_params;\r
14         \r
15         return X_NET_FormWrapper;\r
16 };\r
17 \r
18 /*\r
19  * form 構築時に "><script> といった文字列の挿入を禁止するために " を エスケープする、併せて改行文字を消す\r
20  */\r
21 function X_NET_Form_escapeQuote( str ){\r
22         return X_String_toChrReferance( str );\r
23 };\r
24 \r
25 X_TEMP.X_NET_Form_params = {\r
26         \r
27                         _busy     : false,\r
28                         _canceled : false,\r
29                         \r
30                         timeout   : 1000,\r
31                         isJump    : false, // ページを離脱するか?\r
32                         \r
33                         load : function( option ){\r
34                                 //createURL\r
35                                 var params  = option[ 'params' ] || {},\r
36                                         target  = option[ 'target' ],\r
37                                         html, k;\r
38                                         \r
39                                 target = target === '_self' ? '_parent' : target === '_blank' ? '_self' : target,\r
40                                 html   = [\r
41                                         '<form method="', X_NET_Form_escapeQuote( option[ 'method' ] || 'GET' ), \r
42                                                 '" action="', X_NET_Form_escapeQuote( option[ 'url' ] || '' ), \r
43                                                 '" target="', X_NET_Form_escapeQuote( target || '_self' ),\r
44                                                 '">' ],\r
45                                 k;\r
46                                 \r
47                                 if( target === '_top' || target === '_parent' ) this.isJump = true;\r
48                                 if( 0 <= option[ 'timeout' ] ) this.timeout = option[ 'timeout' ];\r
49                                 \r
50                                 for( k in params ){\r
51                                         // TODO 使用すべきでない name\r
52                                         html.push( '<input type="hidden" name="', X_NET_Form_escapeQuote( k ), '" value="', X_NET_Form_escapeQuote( params[ k ] || '' ), '">' );\r
53                                 };\r
54                                 \r
55                                 html.push( '</form><script>document.forms[0].submit();</script>' );\r
56                                 \r
57                                 X_NET_FormWrapper\r
58                                         [ 'refresh' ]( html.join( '' ) )\r
59                                         [ 'listen' ]( [ 'ninjaload', 'ninjaerror' ], X_NET_Form_iframeListener );\r
60                                                         \r
61                                 X_NET_FormWrapper._busy = true;\r
62                         },\r
63                         \r
64                         cancel : function(){\r
65                                 X_NET_FormWrapper.reset();\r
66                                 X_NET_FormWrapper._canceled = true;\r
67                         },\r
68                         \r
69                         reset : function(){\r
70                                 X_NET_FormWrapper._busy = X_NET_FormWrapper._canceled = false;\r
71                                 X_NET_FormWrapper[ 'unlisten' ]( [ 'ninjaload', 'ninjaerror' ], X_NET_Form_iframeListener );\r
72                                 X_NET_FormWrapper[ 'refresh' ]( '' );\r
73                                 X_NET_Form_errorTimerID && X_Timer_remove( X_NET_Form_errorTimerID );\r
74                                 X_NET_Form_errorTimerID = X_Net_Form_onloadCount = 0;\r
75                         }\r
76                 };\r
77 \r
78 function X_NET_Form_iframeListener( e ){\r
79         var idoc;\r
80         \r
81         switch( e.type ){\r
82                 case 'ninjaload' :\r
83                         if( this.isJump ){\r
84                                 return;\r
85                         };\r
86                         \r
87                         if( ++X_Net_Form_onloadCount === 1 ){\r
88                                 X_NET_Form_errorTimerID = X_NET_FormWrapper[ 'asyncDispatch' ]( this.timeout, X_EVENT_ERROR );\r
89 \r
90                                 // TODO レスポンスの html にアクセスしたい場合\r
91                                 // TODO samedomain or xiframe-sender\r
92                                 \r
93                                 idoc = this[ '_rawObject' ].contentDocument || this._iwin.document,\r
94                                 \r
95                                 X_NET_FormWrapper[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS, responce : idoc && idoc.body ? idoc.body.innerHTML : '' } );\r
96                         };\r
97                         break;\r
98                 case 'ninjaerror' :\r
99                         console.log( 'iframe onerror' );\r
100                         X_NET_FormWrapper[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
101                         break;\r
102         };\r
103         return X_Callback_UN_LISTEN;\r
104 };\r
105 \r
106 //}+netform