【问题标题】:How can I prevent form submission (page navigation) on artificial submit event in firefox?如何防止在Firefox中人工提交事件的表单提交(页面导航)?
【发布时间】:2023-05-02 06:47:02
【问题描述】:

我所做的似乎都无法阻止表单加载新页面。我有以下测试代码:

<form id="form" onsubmit="return false">
 <input id='input'>
 <input id='submit' type="button" value="click me">
</form>
<script>
 var form = document.getElementById("form")
 form.addEventListener("submit", (ev) => {
   console.log("submit")
   ev.preventDefault()
   ev.returnValue = false
   return false
 })
 form.dispatchEvent(new Event('submit'))
</script>

页面只是一遍又一遍地加载和重新加载。这是Firefox中的错误吗?我在版本 60.7.0esr

【问题讨论】:

  • 删除form.dispatchEvent(new Event('submit')) ??为什么你有一个???
  • @MisterJojo 用于单元测试。
  • 尝试将 {cancellable: true} 添加到事件构造函数中。

标签: javascript html forms firefox


【解决方案1】:

您需要通过将cancelable 属性添加到您需要传递给Event 构造函数的EventInit 对象来创建事件cancelable。默认为false

考虑MDN Event Documentation

cancelable:一个Boolean,表示该事件是否可以 取消。默认为false

var form = document.getElementById("form")
form.addEventListener("submit", (ev) => {
  console.log("submit")
  ev.preventDefault()
  ev.returnValue = false
  return false
})
form.dispatchEvent(new Event('submit', {
  cancelable: true
}))
<form id="form" onsubmit="return false">
  <input id='input'>
  <input id='submit' type="button" value="click me">
</form>

【讨论】:

    【解决方案2】:

    dispatch 事件强制提交表单,除非您将其设置为可取消。也可以加&lt;form onsubmit="return false"&gt; 一个快速的解决方案是:

    <form id="form" onsubmit="return false">
     <input id='input'>
     <input id='submit' type="button" value="click me">
    </form>
    <script>
     var form = document.getElementById("form")
     form.addEventListener("submit", (ev) => {
       console.log("submit")
       ev.preventDefault()
       ev.returnValue = false
       return false
     })
     let event = new Event("submit", {
      bubbles: true,
      cancelable: true,
    });
    form.dispatchEvent(event);
    </script>
    

    希望对你有帮助

    【讨论】:

    • 如果处理程序阻止默认设置,则调度事件不应强制提交表单。此外, onsubmit="return false" 并不能解决问题。页面仍在重新加载。
    • @SaqibRaja 如果我的评论有帮助,你至少应该承认它。
    • @zero298 当我检查代码时,我没有看到你的一行注释。但可以肯定的是,我现在承认你也做对了。干杯!
    最近更新 更多