【问题标题】:Listen for form submission [duplicate]监听表单提交[重复]
【发布时间】:2017-05-16 02:42:12
【问题描述】:

我需要在我的网站上提交表单时进行注册,无论何时何地 - 它可能是动态加载或创建的表单 - 我需要能够知道何时任何表单是关于在页面上提交。由于上述原因,事件侦听器在这里根本不是一个选项。

我在想我还有哪些其他选项,例如,如果我想捕获按钮的点击,我可以在文档中添加一个点击侦听器并检查 event.target 以确定按钮是否已被单击而不向每个特定按钮添加侦听器。我希望我可以对表单提交做同样的事情,但我没有找到合适的事件来监听文档。

想到的另一个解决方案是扩展HTMLFormElement原型并添加一个默认的onclick函数,例如

HTMLFormElement.prototype.onsubmit = function (e) {
    console.log(e);
}

不幸的是,这也是不可能的,在不同的浏览器中出现各种错误,例如

  • TypeError:在未实现接口 HTMLElement 的对象上调用了“set onsubmit”。
  • 未捕获的类型错误:非法调用

我的想法不多了,这不可能吗?

编辑:这个问题显然不是重复的,正如我在我的第一个想法中所描述的那样,确切地说是在建议问题的已接受答案中陈述的内容,我不知道如何在我的案例。

【问题讨论】:

  • 为什么不能选择事件监听器?您可以在任何给定页面上获取表单列表。
  • @pvg 因为我如何知道何时将表单添加到页面?我说的是动态内容。
  • 这取决于你的代码何时运行?这里的上下文是什么? document.forms 不关心表单是如何添加的,它们仍然存在。
  • @pvg 是的,但是如果一个表单是由 javascript 创建并添加到文档中的,那么我怎么知道该表单已添加,所以我在用户提交之前附加了一个事件侦听器呢?假设我不会成为编写页面逻辑的人。
  • @php_nub_qq 你检查我的答案了吗?

标签: javascript html forms


【解决方案1】:

此代码不适用于snippets(因为 sn-ps 不允许提交表单),所以我没有创建,但它会在您的站点中:

$(document).on('submit', 'form', function(e) {
  e.preventDefault();
  console.log('Form submitted');
});
$('body').append($('<form action=""><input type="submit" value="Submit dynamic form" /></form>'));

我使用preventDefault 只是为了确保不会提交表单。您可以在代码中删除它。

这是一个有效的 jsfiddle:
https://jsfiddle.net/dekelb/gr94dg7q/

更新 - vanilla javascript 解决方案:

document.addEventListener('submit', function(e) {
  e.preventDefault();
  console.log('Form submitted');
});

$('body').append($('<form action=""><input type="submit" value="Submit dynamic form" /></form>'));

请注意,相关的 javascript (no-jquery) 是针对 submit 事件的,它与下一行无关(关于向文档添加新表单)。

【讨论】:

  • 这看起来像是一些很酷的 jquery 魔法,但我并没有真正考虑使用 jquery。如果你能解释一下它是如何在幕后工作的,那将会很有帮助。
  • @检查更新
  • 我会被诅咒的,我只是假设这行不通,正如我在问题中所说的那样。你可以说我错了:D 无论如何,非常感谢!
  • 有时提供一个可行的例子比争论某件事是否可行要快:)
猜你喜欢
  • 2013-05-04
  • 1970-01-01
  • 2022-11-24
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 2015-07-03
相关资源
最近更新 更多