【问题标题】:Why won't form.submit() trigger the "submit" event?为什么 form.submit() 不会触发“提交”事件?
【发布时间】:2017-12-08 12:52:08
【问题描述】:

我正在使用 JavaScript .submit() 函数提交我的表单。

form.submit();

但是当我使用 addEventListener 来捕获我的提交事件时,它就不起作用了。

form.addEventListener("submit", function(event){
    //codes
});

我发现 addEvenetListener 函数只会监听 onsubmit 事件而不是提交。执行 form.submit() 时是否有任何替代解决方案来调用我的函数?

ps:出于某些原因,我需要继续使用 form.submit() 来提交我的表单,而不是使用提交按钮。

【问题讨论】:

标签: javascript html


【解决方案1】:

根据MDN

从基于 Gecko 的应用程序调用此方法时,不会触发表单的 onsubmit 事件处理程序(例如,onsubmit="return false;")。一般情况下,不保证会被 HTML 用户代理调用。

要解决此问题,请尝试使用dispatchEvent()

var form = document.querySelector('form');

form.addEventListener('submit', function () {
  console.log('invoked');
  
  return false;
});

// form.submit();
form.dispatchEvent(new Event('submit'));
<form></form>

【讨论】:

  • 刚刚测试,form.dispatchEvent(new Event('submit'));正在为我工​​作。但我正在维护一个旧系统,并且有很多 html 文件。如果我将每个文件的 form.submit() 更改为 form.dispatchEvent(new Event('submit')),那将是一场噩梦
  • @Owl 好吧,如果你有一个好的编辑器,你可以在你的项目目录的所有文件中找到所有出现的字符串,比如.submit(),然后用这个函数替换它们......这比在 JavaScript 中覆盖本机函数要好得多,这是另一种可能性,但非常个坏主意。
  • 我发现这篇文章link,它可能解释了为什么我的事件监听器不工作(我不确定它是否正确)。我会接受您的解决方案并尝试搜索我的所有文件以替换函数 T T
  • @Owl 是的,这与我在回答中从 MDN 引用的信息完全一致。也许你错过了这个或什么?解释确实是正确的。
【解决方案2】:

而不是使用这个然后将事件监听器添加到提交中

var form = $('form');
form.submit();
form.addEventListener("submit", function(event){
    //codes
});

你可以改用这个

var form = $('form');
form.submit(function(event){
    // Do something on submit
});

【讨论】:

    【解决方案3】:

    如果你不需要supportIE & Safari,你可以使用requestSubmit()

    与@Patrick Roberts 的dispatchEvent() 解决方案不同,这也将验证表单的内容!根据MDN

    submit() 提交表单,但仅此而已。另一方面,requestSubmit() 就像单击了提交按钮一样。表单的内容经过验证,只有在验证成功时才会提交表单。提交表单后,提交事件将发送回表单对象。

    或者,如果您可以访问提交按钮(我知道 OP 没有),btn.click() 是自它将进行表单验证以及触发submit 事件。

    【讨论】:

      【解决方案4】:

      让事件处理程序监听按钮点击,然后在回调中调用form.submit()

      【讨论】:

      • 感谢您的回复。实际上,我想在我的表单提交之前调用一个通用函数来执行一些验证检查,并且有很多表单。因此,在每个按钮上绑定 onclick 事件对我来说并不是一个理想的解决方案。
      • 您可以将一个类添加到要监听的按钮中,这样您只需要一个事件处理程序。注意点:这在 jQuery 中会更容易。
      • 我正在维护一个旧系统,并且有很多页面的html文件。如果我为按钮一个一个添加一个类,那对我来说将是一场噩梦。
      • 那很不幸。
      【解决方案5】:

      我认为这个解决方案会比您正在尝试的解决方案更有用。可能有一些语法错误。

      HTML:

      <button onclick="formSubmit()"> Submit form</button>
      

      JavaScript:

      function formSubmit()
      {
         var form = document.getElementById('formName');
         form[0].submit();
      }
      

      【讨论】:

      • 感谢您的回复。实际上我想在我的表单提交之前调用一个通用函数来执行一些验证检查,并且有很多表单。因此,在每个按钮上绑定 onclick 事件对我来说并不是一个理想的解决方案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 2015-10-26
      相关资源
      最近更新 更多