OSDN Git Service

Fix the bug of X.NodeAnime.
[pettanr/clientJs.git] / 0.6.x / js / 06_net / 03_XNetForm.js
index ce5021a..cdbcb4f 100644 (file)
 //{+netform"<form>によるGETとPOST"(動的に生成したフォームによるGETとPOST。)[+net,+ninjaiframe]\r
 \r
-var X_NET_Form_errorTimerID, X_Net_Form_onloadCount = 0;\r
+var X_FormSender_errorTimerID,\r
+       X_FormSender_isLeave, X_FormSender_isSameDomain,\r
+       X_FormSender_onloadCount = 0;\r
 \r
-X_TEMP.X_NET_Form_init = function(){\r
-       X_NET_FormWrapper = X_Class_override( X_NinjaIframe(), X_TEMP.X_NET_Form_params );\r
+X_TEMP.X_FormSender_init = function(){\r
+       X_FormSender = X_Class_override( X_NinjaIframe(), X_TEMP.X_FormSender_params );\r
        \r
-       delete X_TEMP.X_NET_Form_init;\r
-       delete X_TEMP.X_NET_Form_params;\r
+       delete X_TEMP.X_FormSender_init;\r
+       delete X_TEMP.X_FormSender_params;\r
        \r
-       return X_NET_FormWrapper;\r
+       return X_FormSender;\r
 };\r
 \r
 /*\r
- * form 構築時に "><script> といった文字列の挿入を禁止するために " を エスケープする、併せて改行文字を消す\r
+ * form 構築時に "><script> といった文字列の挿入を禁止するために " を エスケープする\r
+ * TODO 改行文字を消す escape?\r
  */\r
-function X_NET_Form_escapeQuote( str ){\r
+function X_FormSender_escapeQuote( str ){\r
+       \r
        return X_String_toChrReferance( str );\r
 };\r
 \r
-X_TEMP.X_NET_Form_params = {\r
-       \r
+X_TEMP.X_FormSender_params = {\r
+\r
                        _busy     : false,\r
                        _canceled : false,\r
                        \r
-                       timeout   : 1000,\r
-                       isJump    : false, // ページを離脱するか?\r
-                       \r
                        load : function( option ){\r
                                //createURL\r
-                               var params  = option[ 'params' ] || {},\r
-                                       target  = option[ 'target' ],\r
+                               var params  = option[ 'params'  ] || {},\r
+                                       url     = option[ 'url' ],\r
+                                       target  = option[ 'target'  ],\r
+                                       timeout = option[ 'timeout' ],\r
+                                       // http://search.web-sun.com/zatu/charset.html\r
+                                       // charset = option[ 'charset' ],\r
                                        html, k;\r
                                        \r
-                               target = target === '_self' ? '_parent' : target === '_blank' ? '_self' : target,\r
+                               target = target === '_self' ? '_parent' : target === '_blank' ? '_self' : target || '_self',\r
                                html   = [\r
-                                       '<form method="', X_NET_Form_escapeQuote( option[ 'method' ] || 'GET' ), \r
-                                               '" action="', X_NET_Form_escapeQuote( option[ 'url' ] || '' ), \r
-                                               '" target="', X_NET_Form_escapeQuote( target || '_self' ),\r
-                                               '">' ],\r
-                               k;\r
+                                       // <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">\r
+                                       '<form method="', X_FormSender_escapeQuote( option[ 'method' ] || 'GET' ), \r
+                                               '" action="', X_FormSender_escapeQuote( url || '' ), \r
+                                               '" target="', X_FormSender_escapeQuote( target ),\r
+                                               '">' ];\r
                                \r
-                               if( target === '_top' || target === '_parent' ) this.isJump = true;\r
-                               if( 0 <= option[ 'timeout' ] ) this.timeout = option[ 'timeout' ];\r
+                               X_FormSender_isLeave      = target === '_top' || target === '_parent';\r
+                               X_FormSender_isSameDomain = X_URL_isSameDomain( url );\r
                                \r
                                for( k in params ){\r
                                        // TODO 使用すべきでない name\r
-                                       html.push( '<input type="hidden" name="', X_NET_Form_escapeQuote( k ), '" value="', X_NET_Form_escapeQuote( params[ k ] || '' ), '">' );\r
+                                       html.push( '<input type="hidden" name="', X_FormSender_escapeQuote( k ), '" value="', X_FormSender_escapeQuote( params[ k ] || '' ), '">' );\r
+                                       // TODO 改行を含む text には textarea\r
                                };\r
                                \r
                                html.push( '</form><script>document.forms[0].submit();</script>' );\r
-                               \r
-                               X_NET_FormWrapper\r
+\r
+                               X_FormSender\r
                                        [ 'refresh' ]( html.join( '' ) )\r
-                                       [ 'listen' ]( [ 'ninjaload', 'ninjaerror' ], X_NET_Form_iframeListener );\r
-                                                       \r
-                               X_NET_FormWrapper._busy = true;\r
+                                       [ 'listen' ]( [ 'ninjaload', 'ninjaerror' ], X_FormSender_iframeListener );\r
+                               \r
+                               if( 0 < timeout ){\r
+                                       X_FormSender_errorTimerID = X_FormSender[ 'asyncDispatch' ]( timeout, { type : X_EVENT_ERROR, 'timeout' : true } );\r
+                               };\r
+                                               \r
+                               X_FormSender._busy = true;\r
                        },\r
                        \r
                        cancel : function(){\r
-                               X_NET_FormWrapper.reset();\r
-                               X_NET_FormWrapper._canceled = true;\r
+                               X_FormSender.reset();\r
+                               X_FormSender._canceled = true;\r
                        },\r
                        \r
                        reset : function(){\r
-                               X_NET_FormWrapper._busy = X_NET_FormWrapper._canceled = false;\r
-                               X_NET_FormWrapper[ 'unlisten' ]( [ 'ninjaload', 'ninjaerror' ], X_NET_Form_iframeListener );\r
-                               X_NET_FormWrapper[ 'refresh' ]( '' );\r
-                               X_NET_Form_errorTimerID && X_Timer_remove( X_NET_Form_errorTimerID );\r
-                               X_NET_Form_errorTimerID = X_Net_Form_onloadCount = 0;\r
+                               X_FormSender._busy = X_FormSender._canceled = false;\r
+                               X_FormSender\r
+                                       [ 'unlisten' ]( [ 'ninjaload', 'ninjaerror' ], X_FormSender_iframeListener )\r
+                                       [ 'refresh' ]( '' );\r
+                               X_FormSender_errorTimerID && X_Timer_remove( X_FormSender_errorTimerID );\r
+                               X_FormSender_errorTimerID = X_FormSender_onloadCount = 0;\r
                        }\r
                };\r
 \r
-function X_NET_Form_iframeListener( e ){\r
+function X_FormSender_iframeListener( e ){\r
        var idoc;\r
        \r
        switch( e.type ){\r
                case 'ninjaload' :\r
-                       if( this.isJump ){\r
+                       if( X_FormSender_isLeave ){\r
                                return;\r
                        };\r
                        \r
-                       if( ++X_Net_Form_onloadCount === 1 ){\r
-                               X_NET_Form_errorTimerID = X_NET_FormWrapper[ 'asyncDispatch' ]( this.timeout, X_EVENT_ERROR );\r
-\r
-                               // TODO レスポンスの html にアクセスしたい場合\r
-                               // TODO samedomain or xiframe-sender\r
-                               \r
-                               idoc = this[ '_rawObject' ].contentDocument || this._iwin.document,\r
-                               \r
-                               X_NET_FormWrapper[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS, response : idoc && idoc.body ? idoc.body.innerHTML : '' } );\r
+                       if( ++X_FormSender_onloadCount === 1 ){\r
+                               if( X_FormSender_isSameDomain ){\r
+                                       idoc = this[ '_rawObject' ].contentDocument || this._iwin.document;\r
+                                       X_FormSender[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS, response : idoc && idoc.body ? idoc.body.innerHTML : '' } );                                 \r
+                               } else {\r
+                                       X_FormSender[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS } );\r
+                               };\r
                        };\r
                        break;\r
                case 'ninjaerror' :\r
                        console.log( 'iframe onerror' );\r
-                       X_NET_FormWrapper[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
+                       X_FormSender[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
                        break;\r
        };\r
        return X_CALLBACK_UN_LISTEN;\r