如何捕获form.submit的响应

nmd*_*mdr 117 javascript forms form-submit dom-events

我有以下代码:

<script type="text/javascript">
        function SubmitForm()
        {

            form1.submit();
        }

        function ShowResponse()
        {

        }
</script>
.
.
.
<div>
    <a href="#" onclick="SubmitForm();">Click</a>
</div>
Run Code Online (Sandbox Code Playgroud)

我想捕获html响应form1.submit?我该怎么做呢?我可以在form1.submit方法中注册任何回调函数吗?

nic*_*ckf 102

使用普通的javascript,您将无法轻松完成此操作.发布表单时,表单输入将发送到服务器并刷新页面 - 数据在服务器端处理.也就是说,该submit()函数实际上并不返回任何内容,它只是将表单数据发送到服务器.

如果你真的想在Javascript中获得响应(没有刷新页面),那么你需要使用AJAX,当你开始讨论使用AJAX时,你需要使用一个库.jQuery是迄今为止最受欢迎的,也是我个人的最爱.有一个很棒的jQuery插件叫做Form,它可以完全按你想要的那样做.

这是你如何使用jQuery和插件:

$('#myForm')
    .ajaxForm({
        url : 'myscript.php', // or whatever
        dataType : 'json',
        success : function (response) {
            alert("The server says: " + response);
        }
    })
;
Run Code Online (Sandbox Code Playgroud)

  • 公平地说,你不需要使用AJAX库.库是使用javascript编写的,因此存在非库解决方案.那就是说,我100%赞成使用库来抽象制作AJAX调用所涉及的所有荒谬和复杂性. (31认同)
  • 在这里使用库真的不值得.在纯JS代码不是要复杂得多:`VAR XHR =新的XMLHttpRequest()xhr.open( "POST", "myscript.php"); xhr.onload = function(event){alert("服务器说:"+ event.target.response); }; var formData = new FormData(document.getElementById("myForm")); xhr.send(FORMDATA);` (13认同)
  • jQuery表单插件的+1.它真棒,但你的'目标'属性错了.它不像表单的'action'属性; 即它不是提交目的地.来自[docs](http://malsup.com/jquery/form/#options-object):**target - 标识要使用服务器响应更新的页面中的元素.** (5认同)
  • 我将此评论更多地作为上述解决方案的FYI发布,除非在IE 9及更低版本上通过AJAX进行文件上传.我在非HTML5 IE浏览器(IE 9及更低版本)上通过ajax提交文件时遇到问题,所以我必须使用iframe hack.但是使用iframe hack需要form.submit(),但你不能等待响应告诉你它是否成功.这让我陷入了困境. (3认同)

Ate*_*ral 55

Ajax的替代方法是将不可见的设置<iframe>为表单的目标,并<iframe>在其onload处理程序中读取其内容.但是为什么有Ajax时会烦恼?

注意:我只是想提一下这个替代方案,因为有些答案声称没有Ajax 就无法实现这一点.

  • 假设您是想通过点击按钮发布到URL以进行下载?现在您无法使用Ajax来满足您的要求.想要在下载完成后清理或更新界面吗?现在是时候想要来自POST的回调**不是*Ajax.(Necropost,我知道.) (3认同)
  • 请注意,这仅在表单提交操作与 iframe 位于同一站点时才有效。否则同源策略将阻止它。 (3认同)
  • @Dropped.on.Caprica 是的,这仍然是`&lt;iframe&gt;` POST 的合法用例(带有对`parent` 的回调)。对于下载和上传等... (2认同)

raj*_*_kw 26

我这样做,它的工作.

$('#form').submit(function(){
    $.ajax({
      url: $('#form').attr('action'),
      type: 'POST',
      data : $('#form').serialize(),
      success: function(){
        console.log('form submitted.');
      }
    });
    return false;
});
Run Code Online (Sandbox Code Playgroud)

  • 你可能想要`event.preventDefault();`(`event` = submit function的第一个参数)而不是`return false`.返回false不会简单地阻止浏览器提交表单,还会阻止其他副作用发生,这可能很重要.[问题](http://stackoverflow.com/a/5927706/761771)[问题](http://stackoverflow.com/a/5927706/761771) a/855605/761771)相关[to](http://stackoverflow.com/a/11184286/761771)这个. (4认同)

rog*_*ack 26

非jQuery方式,摘自12me21的评论:

var xhr = new XMLHttpRequest();
xhr.open("POST", "/your/url/name.php"); 
xhr.onload = function(event){ 
    alert("Success, server responded with: " + event.target.response); // raw response
}; 
// or onerror, onabort
var formData = new FormData(document.getElementById("myForm")); 
xhr.send(formData);
Run Code Online (Sandbox Code Playgroud)

对于POST默认内容类型是"application/x-www-form-urlencoded",它与我们在上面的代码段中发送的内容相匹配.如果你想发送"其他东西"或调整它,请在这里看到一些细节的细节.

  • 其实这是正确的答案!因为所有其他答案都完全相同,但是被另外一层库混淆了. (5认同)

Mar*_*cus 11

未来的互联网搜索者:

对于新的浏览器(截至2018年:Chrome,Firefox,Safari,Opera,Edge和大多数移动浏览器,但不是IE),fetch是一种简化异步网络调用的标准API(我们曾经需要XMLHttpRequest或jQuery $.ajax).

这是一种传统形式:

<form id="myFormId" action="/api/process/form" method="post">
    <!-- form fields here -->
    <button type="submit">SubmitAction</button>
</form>
Run Code Online (Sandbox Code Playgroud)

如果上面的表单交给你(或者你创建它是因为它是语义html),那么你可以将fetch代码包装在事件监听器中,如下所示:

document.forms['myFormId'].addEventListener('submit', (event) => {
    event.preventDefault();
    // TODO do something here to show user that form is being submitted
    fetch(event.target.action, {
        method: 'POST',
        body: new URLSearchParams(new FormData(event.target)) // event.target is the form
    }).then((resp) => {
        return resp.json(); // or resp.text() or whatever the server sends
    }).then((body) => {
        // TODO handle body
    }).catch((error) => {
        // TODO handle error
    });
});
Run Code Online (Sandbox Code Playgroud)

(或者,如果您希望在没有提交事件的情况下手动调用原始海报,只需将fetch代码放在那里并传递对form元素的引用而不是使用event.target.)

文档:

抓取:https: //developer.mozilla.org/en-US/docs/Web/API/Fetch_API

其他:https: //developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript 2018年的那个页面没有提到fetch(还).但它提到了target ="myIFrame"技巧已被弃用.它还有一个用于'submit'事件的form.addEventListener示例.

  • MDN 的重要说明:“即使响应是 HTTP 404 或 500,从 fetch() 返回的 Promise **也不会拒绝 HTTP 错误状态**。相反,它将正常解析(将 ok 状态设置为 false) ,并且**它只会在网络故障或任何阻止请求完成的情况下拒绝**。” 这意味着“then”回调必须检查 HTTP 状态。 (2认同)

Ser*_*gio 9

我不确定你是否理解submit()的作用......

当您form1.submit();将表单信息发送到Web服务器时.

WebServer将做任何应该做的事情,并将一个全新的网页返回给客户端(通常是同一页面上有更改的内容).

所以,你无法"捕获"form.submit()动作的返回.


Dio*_*ane 6

没有回调.这就像是一个链接.

如果您想捕获服务器响应,请使用AJAX或将其发布到Iframe,并抓住iframe onload()事件后出现的内容.