You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击提交按钮时的委托事件(jQuery):如何通过e实现异步后提交表单?

如何利用事件对象实现异步AJAX完成后再提交表单?

没问题,完全可以只用事件对象e来实现你的需求!我来一步步给你讲清楚怎么弄:

首先,你原来的代码里用return false确实能阻止表单提交,但其实return false在jQuery事件处理里相当于同时做了e.preventDefault()和e.stopPropagation(),而我们这里只需要阻止表单的默认提交行为就够了,所以换成e.preventDefault()会更精准。

接下来,核心思路是:先阻止默认提交,等AJAX请求成功后,再手动触发表单的提交动作。具体代码可以这么写:

$submitButton.click(function(e){
  // 先阻止表单的默认提交行为
  e.preventDefault();
  
  // 调用你的异步方法,注意要让doSomething返回AJAX的jqXHR对象
  doSomething(e)
    .done(function(response) {
      // AJAX成功后,手动提交表单
      // 这里用原生DOM的submit(),避免再次触发jQuery的事件监听导致循环
      $submitButton.closest('form')[0].submit();
    })
    .fail(function() {
      // 可选:处理AJAX失败的情况,比如提示用户
      alert('请求失败,请稍后重试');
    });
});

然后你的doSomething方法需要返回AJAX请求的对象,这样才能链式调用.done():

function doSomething(e) {
  // 这里可以根据需要使用事件对象e,比如获取表单数据之类的
  const formData = $(e.target).closest('form').serialize();
  
  return $.ajax({
    url: '/your-submit-url',
    method: 'POST',
    data: formData,
    // 其他配置项
  });
}

为什么这么做可行?

  • e.preventDefault()会直接阻止浏览器默认的表单提交动作,这样表单就不会在AJAX请求还没完成时就提交了
  • 等AJAX请求成功后,我们通过closest('form')找到按钮所在的表单,然后调用原生DOM元素的submit()方法——这个方法不会触发按钮的点击事件,所以不会再次进入我们的点击处理函数,也就不会出现循环提交的问题

如果你的doSomething已经是现成的方法,只要确保它能返回AJAX的jqXHR对象,就能用这个方式来衔接后续的提交动作啦。

内容的提问来源于stack exchange,提问作者Carlos Navarro Astiasarán

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:29:30