1 //{+netform"<form>によるGETとPOST"(動的に生成したフォームによるGETとPOST。)[+net,+ninjaiframe]
\r
3 var X_FormSender_errorTimerID,
\r
4 X_FormSender_isLeave, X_FormSender_isSameDomain,
\r
5 X_FormSender_onloadCount = 0;
\r
7 X_TEMP.X_FormSender_init = function(){
\r
8 X_FormSender = X_Class_override( X_NinjaIframe(), X_TEMP.X_FormSender_params );
\r
10 delete X_TEMP.X_FormSender_init;
\r
11 delete X_TEMP.X_FormSender_params;
\r
13 return X_FormSender;
\r
17 * form 構築時に "><script> といった文字列の挿入を禁止するために " を エスケープする
\r
18 * TODO 改行文字を消す escape?
\r
20 function X_FormSender_escapeQuote( str ){
\r
22 return X_String_toChrReferance( str );
\r
25 X_TEMP.X_FormSender_params = {
\r
30 load : function( option ){
\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
40 target = target === '_self' ? '_parent' : target === '_blank' ? '_self' : target || '_self',
\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
48 X_FormSender_isLeave = target === '_top' || target === '_parent';
\r
49 X_FormSender_isSameDomain = X_URL_isSameDomain( url );
\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
57 html.push( '</form><script>document.forms[0].submit();</script>' );
\r
60 [ 'refresh' ]( html.join( '' ) )
\r
61 [ 'listen' ]( [ 'ninjaload', 'ninjaerror' ], X_FormSender_iframeListener );
\r
64 X_FormSender_errorTimerID = X_FormSender[ 'asyncDispatch' ]( timeout, { type : X_EVENT_ERROR, 'timeout' : true } );
\r
67 X_FormSender._busy = true;
\r
70 cancel : function(){
\r
71 X_FormSender.reset();
\r
72 X_FormSender._canceled = true;
\r
76 X_FormSender._busy = X_FormSender._canceled = false;
\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
85 function X_FormSender_iframeListener( e ){
\r
90 if( X_FormSender_isLeave ){
\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
99 X_FormSender[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS } );
\r
103 case 'ninjaerror' :
\r
104 console.log( 'iframe onerror' );
\r
105 X_FormSender[ 'asyncDispatch' ]( X_EVENT_ERROR );
\r
108 return X_CALLBACK_UN_LISTEN;
\r