【发布时间】:2016-05-11 03:48:26
【问题描述】:
我有一个需要两个提交按钮的 html 表单。单击时,每个按钮都需要捕获事件(表单提交),然后处理表单数据并在 GUI 中向前或向后移动,具体取决于按下了两个按钮之一。
我还没有找到一种方法来在 Javascript 中捕获在提交事件处理程序中按下了哪个按钮。使用 click 事件处理程序时,此操作不会附加任何表单。有什么建议吗?
【问题讨论】:
标签: javascript html
我有一个需要两个提交按钮的 html 表单。单击时,每个按钮都需要捕获事件(表单提交),然后处理表单数据并在 GUI 中向前或向后移动,具体取决于按下了两个按钮之一。
我还没有找到一种方法来在 Javascript 中捕获在提交事件处理程序中按下了哪个按钮。使用 click 事件处理程序时,此操作不会附加任何表单。有什么建议吗?
【问题讨论】:
标签: javascript html
我更喜欢使用表单的submit 事件而不是click 事件,它包括一个submitter 属性,指示单击了哪个按钮。 (奖励:表单在submit 被解雇之前得到验证)。
form.addEventListener('submit', (event) => {
if (event.submitter.name === 'action-a') doActionA();
else if (event.submitter.name === 'action-b') doACtionB();
});
编辑:事实证明SubmitEvent.submiter 是一个相对较新的功能,可能不适用于某些浏览器[1]。我切换到以下方法:
let submitter = '';
buttons.forEach((btn) => btn.addEventListener('click', () => submitter = btn.name));
form.addEventListener('submit', (event) => {
if (submitter === 'action-a') doActionA();
else if (submitter === 'action-b') doACtionB();
});
[1]https://developer.mozilla.org/en-US/docs/Web/API/SubmitEvent/submitter#browser_compatibility
【讨论】:
事件对象上有一个名为target 的属性,它是对触发事件的DOM 节点的引用。它应该包含被点击的按钮。
【讨论】:
event.target 带来了所有的表单对象,比如输入和两个按钮,我还没有找到一种方法来捕捉哪个按钮触发了事件。
为 2 个按钮使用 2 个不同的名称并捕获点击事件。该名称可以让您识别并处理按下的指定按钮。
【讨论】:
如https://jsfiddle.net/0fuq5dhf/1/所示:
var form = document.getElementById("frmData");
form.addEventListener("click", function(event) {
var formData = $( '#' + event.currentTarget.id ).serialize();
if(event.target.id == "submit1") {
//Process for first submit button
console.log(formData);
} else {
//process for the 2nd submit button
console.log(formData);
}
});
您可以获取目标来确定单击了哪个按钮,并根据单击的按钮序列化要处理的表单数据。
【讨论】:
event.target.id 实际上返回的是表单 ID,而不是按钮 ID。