如何防止表单被提交?

IT技术 javascript html forms
2021-01-29 23:29:34

我有一个表单,在某个地方有一个提交按钮。

但是,我想以某种方式“捕获”提交事件并防止它发生。

有什么办法可以做到这一点吗?

我无法修改提交按钮,因为它是自定义控件的一部分。

6个回答

与其他答案不同,返回false只是答案的一部分考虑在 return 语句之前发生 JS 错误的场景......

html

<form onsubmit="return mySubmitFunction(event)">
  ...
</form>

脚本

function mySubmitFunction()
{
  someBug()
  return false;
}

返回false这里不会被执行,表单将以任何一种方式提交。您还应该调用preventDefault以阻止 Ajax 表单提交的默认表单操作。

function mySubmitFunction(e) {
  e.preventDefault();
  someBug();
  return false;
}

在这种情况下,即使有错误,表单也不会提交!

或者,try...catch可以使用块。

function mySubmit(e) { 
  e.preventDefault(); 
  try {
   someBug();
  } catch (e) {
   throw new Error(e.message);
  }
  return false;
}
@BenRowe 您应该将 evt 参数添加到被调用的方法中。 (<form onsubmit="return mySubmitFunction(evt)">).否则它会给出未定义的错误。
2021-03-10 23:29:34
为什么不false直接从返回onsumbit
2021-03-17 23:29:34
<form onsubmit="return mySubmitFunction(event)"> 工作......不得不在firefox中使用括号中的事件这个词
2021-03-22 23:29:34
您可能希望在 onsubmit 中向用户显示错误消息。例如,“完成此必填字段然后提交”。在这种情况下 event.preventDefault 会派上用场
2021-03-26 23:29:34
@ProfK 如果你使用 event.preventDefault() 没关系,try/catch 只是你的错误处理的一部分
2021-03-29 23:29:34

您可以onsubmit像这样使用内联事件

<form onsubmit="alert('stop submit'); return false;" >

或者

<script>
   function toSubmit(){
      alert('I will not submit');
      return false;
   }
</script>

<form onsubmit="return toSubmit();" >

演示

现在,在进行大型项目时,这可能不是一个好主意。您可能需要使用事件侦听器。

在此处阅读有关内联事件与事件侦听器(addEventListener 和 IE 的 attachEvent)的更多信息因为我无法比Chris Baker解释得更多

两者都是正确的,但它们本身都不是“最好的”,开发人员选择使用这两种方法可能是有原因的。

不错,在路上快速解决。
2021-03-10 23:29:34
出于某种原因,<form onsubmit="return false;" >对我不起作用。
2021-03-17 23:29:34

使用.addEventListener()以下.preventDefault()方法将事件侦听器附加到表单,然后调用方法event

const element = document.querySelector('form');
element.addEventListener('submit', event => {
  event.preventDefault();
  // actual logic, e.g. validate the form
  console.log('Form submission cancelled.');
});
<form>
  <button type="submit">Submit</button>
</form>

我认为这是一个比定义一个submitonsubmit属性内联事件处理程序更好的解决方案因为它将网页逻辑和结构分开。维护逻辑与 HTML 分离的项目要容易得多。请参阅:不显眼的 JavaScript

使用DOM 对象.onsubmit属性form不是一个好主意,因为它会阻止您将多个提交回调附加到一个元素。请参阅addEventListener 与 onclick

内联垃圾仍然是投票最多的,但这并不是自 2012 年以来在 JS 中编程的真正方式?这个解决方案就是解决方案。
2021-03-17 23:29:34
我喜欢这个解决方案的大部分内容,但我避免使用,querySelector因为它返回文档中与给定选择器匹配的第一个元素。如果稍后在页面中较早地添加第二个表单,这可能会使您的代码中断,这是经常发生的事情,例如,如果您决定稍后将登录表单添加到页眉,或者即使不可见或隐藏的表单由内容管理module。(我已经在项目中看到过这种情况。)使用getElementById更可靠,因为 ID必须是唯一的,至少对于每个 DOM 树,根据 HTML 规范,如果不是,验证器会捕获。
2021-03-25 23:29:34
+1 不知道为什么所有其他答案都继续使用内联提交,因为 OP 提到他无法更改按钮(这意味着他可能也无法更改表单)。想知道如果我们有按钮 id 是否有办法获得“表单”
2021-04-03 23:29:34
& 对于 jquery: $("button").click(function(e) { e.preventDefault() });
2021-04-08 23:29:34

试试这个...

HTML代码

<form class="submit">
    <input type="text" name="text1"/>
    <input type="text" name="text2"/>
    <input type="submit" name="Submit" value="submit"/>
</form>

jQuery 代码

$(function(){
    $('.submit').on('submit', function(event){
        event.preventDefault();
        alert("Form Submission stopped.");
    });
});

或者

$(function(){
    $('.submit').on('submit', function(event){
       event.preventDefault();
       event.stopPropagation();
       alert("Form Submission prevented / stopped.");
    });
});
stopPropagation是唯一对我有用的东西。谢谢!:)
2021-03-17 23:29:34
@Gothdo 是的,完全一样。eventObject.preventDefault。绑定处理程序的方式不会改变解决方案。我什至认为您的答案与公认的答案没有什么不同。
2021-03-23 23:29:34
这个问题中没有 jQuery 标签。
2021-03-28 23:29:34
@Gothdo,但解决方案仍然相同。疯了吧?
2021-04-08 23:29:34

以下工作截至目前(在 chrome 和 firefox 中测试):

<form onsubmit="event.preventDefault(); return validateMyForm();">

其中 validateMyForm() 是一个false在验证失败时返回的函数关键点是使用名称event我们不能用于例如e.preventDefault()

onsubmit="返回validateMyForm();" 就足够了,但 validateMyForm() 应该返回 true 或 false。
2021-04-05 23:29:34