OSDN Git Service

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