OSDN Git Service

Fix the bug of X.NodeAnime.
[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, X_FormSender_isSameDomain,\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                                         url     = option[ 'url' ],\r
34                                         target  = option[ 'target'  ],\r
35                                         timeout = option[ 'timeout' ],\r
36                                         // http://search.web-sun.com/zatu/charset.html\r
37                                         // charset = option[ 'charset' ],\r
38                                         html, k;\r
39                                         \r
40                                 target = target === '_self' ? '_parent' : target === '_blank' ? '_self' : target || '_self',\r
41                                 html   = [\r
42                                         // <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">\r
43                                         '<form method="', X_FormSender_escapeQuote( option[ 'method' ] || 'GET' ), \r
44                                                 '" action="', X_FormSender_escapeQuote( url || '' ), \r
45                                                 '" target="', X_FormSender_escapeQuote( target ),\r
46                                                 '">' ];\r
47                                 \r
48                                 X_FormSender_isLeave      = target === '_top' || target === '_parent';\r
49                                 X_FormSender_isSameDomain = X_URL_isSameDomain( url );\r
50                                 \r
51                                 for( k in params ){\r
52                                         // TODO 使用すべきでない name\r
53                                         html.push( '<input type="hidden" name="', X_FormSender_escapeQuote( k ), '" value="', X_FormSender_escapeQuote( params[ k ] || '' ), '">' );\r
54                                         // TODO 改行を含む text には textarea\r
55                                 };\r
56                                 \r
57                                 html.push( '</form><script>document.forms[0].submit();</script>' );\r
58 \r
59                                 X_FormSender\r
60                                         [ 'refresh' ]( html.join( '' ) )\r
61                                         [ 'listen' ]( [ 'ninjaload', 'ninjaerror' ], X_FormSender_iframeListener );\r
62                                 \r
63                                 if( 0 < timeout ){\r
64                                         X_FormSender_errorTimerID = X_FormSender[ 'asyncDispatch' ]( timeout, { type : X_EVENT_ERROR, 'timeout' : true } );\r
65                                 };\r
66                                                 \r
67                                 X_FormSender._busy = true;\r
68                         },\r
69                         \r
70                         cancel : function(){\r
71                                 X_FormSender.reset();\r
72                                 X_FormSender._canceled = true;\r
73                         },\r
74                         \r
75                         reset : function(){\r
76                                 X_FormSender._busy = X_FormSender._canceled = false;\r
77                                 X_FormSender\r
78                                         [ 'unlisten' ]( [ 'ninjaload', 'ninjaerror' ], X_FormSender_iframeListener )\r
79                                         [ 'refresh' ]( '' );\r
80                                 X_FormSender_errorTimerID && X_Timer_remove( X_FormSender_errorTimerID );\r
81                                 X_FormSender_errorTimerID = X_FormSender_onloadCount = 0;\r
82                         }\r
83                 };\r
84 \r
85 function X_FormSender_iframeListener( e ){\r
86         var idoc;\r
87         \r
88         switch( e.type ){\r
89                 case 'ninjaload' :\r
90                         if( X_FormSender_isLeave ){\r
91                                 return;\r
92                         };\r
93                         \r
94                         if( ++X_FormSender_onloadCount === 1 ){\r
95                                 if( X_FormSender_isSameDomain ){\r
96                                         idoc = this[ '_rawObject' ].contentDocument || this._iwin.document;\r
97                                         X_FormSender[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS, response : idoc && idoc.body ? idoc.body.innerHTML : '' } );                                 \r
98                                 } else {\r
99                                         X_FormSender[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS } );\r
100                                 };\r
101                         };\r
102                         break;\r
103                 case 'ninjaerror' :\r
104                         console.log( 'iframe onerror' );\r
105                         X_FormSender[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
106                         break;\r
107         };\r
108         return X_CALLBACK_UN_LISTEN;\r
109 };\r
110 \r
111 //}+netform