【问题标题】:Debugging two buttons for one form为一个表单调试两个按钮
【发布时间】:2020-08-11 19:43:09
【问题描述】:

我查看了this questionthis question as well,但使用<button> 标签的解决方案对我不起作用。

我认为这是因为我使用的是FormData,但我认为FormData 会获取所有提交的键和值。

这是一个简单的JSFiddle,用于我正在尝试做的事情,但它不起作用。我希望看到 firstsecond 值出现在 FormData 对象中,但只有 input-data 出现。

我需要能够确定提交表单时按下了哪个按钮。

function handleSubmit(event) {
    event.preventDefault(); // don't have the browser refresh on submit
    const formData = new FormData(event.target);
    for (var pair of formData.entries()) {
        console.log(pair[0]+ ' ==> ' + pair[1]);
    }
}

const form = document.getElementById('form');

form.addEventListener('submit', handleSubmit);
  <form id="form">
    <input name="input-data"/>
    <button type="submit" name="action" value="first">Submit</button>
    <button type="submit" name="action" value="second">Another Submit</button>
  </form>

【问题讨论】:

  • 您的问题是什么?你的 JSFiddle 对我来说很好用。
  • 问题已被编辑以解释我的预期
  • 有关正在发生的事情和其他解决方法的更多信息,请参阅:stackoverflow.com/questions/38277900/…
  • 如果表单直接通过keysCrtl+Enter提交呢?

标签: javascript html form-data


【解决方案1】:

我认为不能使用 FormData 来完成,

你必须自己编写代码,类似这样:

const MyForm = document.getElementById('my-form')

var lastClick = null

MyForm.onclick=evt=>
  {
  lastClick = evt.target.matches('button[type=submit]') 
               ? evt.target.name 
               : null
  }

MyForm.onsubmit=evt=>
  {
  evt.preventDefault()
  console.clear()
  console.log ( 'submit by', lastClick) 
  let formData = new FormData(MyForm);
  for (let pair of formData.entries())
    {
    console.log(pair[0],' ==> ',pair[1])
    }
}
<form id="my-form">
    <input name="input-data"/>
    <button type="submit" name="first">Submit</button>
    <button type="submit" name="second">Another Submit</button>
  </form>

【讨论】:

  • 如何确定在提交表单和处理表单之间不会发生点击?换句话说,如果在console.clear() 行之后发生了不在表单上的点击会发生什么?它会记录submit by [null]吗?
  • @ProQ ibrahimyilmaz 的第二个解决方案(他在我的之后添加)是 100% 等效
【解决方案2】:

FormData 不收集按钮的值。您可以像这样为隐藏输入设置值:

function handleSubmit(event) {
    event.preventDefault(); // don't have the browser refresh on submit

    document.getElementById('action').value = event.submitter.value;

    const formData = new FormData(event.target);
    for (var pair of formData.entries()) {
        console.log(pair[0]+ ' ==> ' + pair[1]);
    }
}

const form = document.getElementById('form');

form.addEventListener('submit', handleSubmit);
<form id="form">
  <input name="input-data"/>
  <input type="hidden" name="action" id="action" value=""/>
  <button type="submit" name="action" value="first">Submit</button>
  <button type="submit" name="action" value="second">Another Submit</button>
</form>

跨浏览器解决方案

function handleSubmit(event) {
  const formData = new FormData();
  formData.append("input-data", document.getElementById("input-data").value)
  formData.append(event.name, event.value);

  for (var entry of formData) {
      console.log(entry[0] + ' => ' + entry[1]);
  }
}
<form id="form">
  <input id="input-data"/>
  <button type="button" name="action" value="first" onclick="handleSubmit(this)">Submit</button>
  <button type="button" name="action2" value="second" onclick="handleSubmit(this)">Another Submit</button>
</form>

【讨论】:

  • event.submitter 仅适用于 Chrome 和 Android => caniuse.com/#search=submitter
  • @Pro Q,此解决方案仅适用于上述浏览器。您可以为跨浏览器解决方案手动收集您的值。
  • 我为它加了一个sn-p
  • @ProQ 如果以编程方式提交表单,这些解决方案都不起作用
  • @MisterJojo 我们如何知道在以编程方式提交时单击了哪个按钮?但是,如果您想知道,这将起作用:handleSubmit({ name: "input-data", value: "programmatically" })
猜你喜欢
  • 2015-07-04
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
相关资源
最近更新 更多