OSDN Git Service

244e5d3c0b8846f4c08c595eee09a1419e0e0023
[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 var X_FormSender_errorTimerID, X_FormSender_onloadCount = 0;\r
4 \r
5 X_TEMP.X_FormSender_init = function(){\r
6         X_FormSender = X_Class_override( X_NinjaIframe(), X_TEMP.X_FormSender_params );\r
7         \r
8         delete X_TEMP.X_FormSender_init;\r
9         delete X_TEMP.X_FormSender_params;\r
10         \r
11         return X_FormSender;\r
12 };\r
13 \r
14 /*\r
15  * form 構築時に "><script> といった文字列の挿入を禁止するために " を エスケープする\r
16  * TODO 改行文字を消す\r
17  */\r
18 function X_FormSender_escapeQuote( str ){\r
19         \r
20         return X_String_toChrReferance( str );\r
21 };\r
22 \r
23 X_TEMP.X_FormSender_params = {\r
24         \r
25                         _busy     : false,\r
26                         _canceled : false,\r
27                         \r
28                         timeout   : 1000,\r
29                         isJump    : false, // ページを離脱するか?\r
30                         \r
31                         load : function( option ){\r
32                                 //createURL\r
33                                 var params  = option[ 'params' ] || {},\r
34                                         target  = option[ 'target' ],\r
35                                         html, k;\r
36                                         \r
37                                 target = target === '_self' ? '_parent' : target === '_blank' ? '_self' : target || '_self',\r
38                                 html   = [\r
39                                         '<form method="', X_FormSender_escapeQuote( option[ 'method' ] || 'GET' ), \r
40                                                 '" action="', X_FormSender_escapeQuote( option[ 'url' ] || '' ), \r
41                                                 '" target="', X_FormSender_escapeQuote( target ),\r
42                                                 '">' ];\r
43                                 \r
44                                 if( target === '_top' || target === '_parent' ) X_FormSender.isJump = true;\r
45                                 if( 0 <= option[ 'timeout' ] ) X_FormSender.timeout = option[ 'timeout' ];\r
46                                 \r
47                                 for( k in params ){\r
48                                         // TODO 使用すべきでない name\r
49                                         html.push( '<input type="hidden" name="', X_FormSender_escapeQuote( k ), '" value="', X_FormSender_escapeQuote( params[ k ] || '' ), '">' );\r
50                                         // TODO 改行を含む text には textarea\r
51                                 };\r
52                                 \r
53                                 html.push( '</form><script>document.forms[0].submit();</script>' );\r
54                                 \r
55                                 X_FormSender\r
56                                         [ 'refresh' ]( html.join( '' ) )\r
57                                         [ 'listen' ]( [ 'ninjaload', 'ninjaerror' ], X_FormSender_iframeListener );\r
58                                                         \r
59                                 X_FormSender._busy = true;\r
60                         },\r
61                         \r
62                         cancel : function(){\r
63                                 X_FormSender.reset();\r
64                                 X_FormSender._canceled = true;\r
65                         },\r
66                         \r
67                         reset : function(){\r
68                                 X_FormSender._busy = X_FormSender._canceled = false;\r
69                                 X_FormSender[ 'unlisten' ]( [ 'ninjaload', 'ninjaerror' ], X_FormSender_iframeListener );\r
70                                 X_FormSender[ 'refresh' ]( '' );\r
71                                 X_FormSender_errorTimerID && X_Timer_remove( X_FormSender_errorTimerID );\r
72                                 X_FormSender_errorTimerID = X_FormSender_onloadCount = 0;\r
73                         }\r
74                 };\r
75 \r
76 function X_FormSender_iframeListener( e ){\r
77         var idoc;\r
78         \r
79         switch( e.type ){\r
80                 case 'ninjaload' :\r
81                         if( X_FormSender.isJump ){\r
82                                 return;\r
83                         };\r
84                         \r
85                         if( ++X_FormSender_onloadCount === 1 ){\r
86                                 X_FormSender_errorTimerID = X_FormSender[ 'asyncDispatch' ]( X_FormSender.timeout, { type : X_EVENT_ERROR, 'timeout' : true } );\r
87 \r
88                                 // TODO レスポンスの html にアクセスしたい場合\r
89                                 // TODO samedomain or xiframe-sender\r
90                                 \r
91                                 idoc = this[ '_rawObject' ].contentDocument || this._iwin.document,\r
92                                 \r
93                                 X_FormSender[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS, response : idoc && idoc.body ? idoc.body.innerHTML : '' } );\r
94                         };\r
95                         break;\r
96                 case 'ninjaerror' :\r
97                         console.log( 'iframe onerror' );\r
98                         X_FormSender[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
99                         break;\r
100         };\r
101         return X_CALLBACK_UN_LISTEN;\r
102 };\r
103 \r
104 //}+netform