如何防止表单被提交?

Nat*_*man 215 html javascript forms

我有一个表单,其中有一个提交按钮.

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

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

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

Ben*_*owe 228

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

HTML

<form onsubmit="return mySubmitFunction(event)">
  ...
</form>
Run Code Online (Sandbox Code Playgroud)

脚本

function mySubmitFunction()
{
  someBug()
  return false;
}
Run Code Online (Sandbox Code Playgroud)

返回false此处将不会执行,表单将以任何方式提交.您还应该调用preventDefault以防止Ajax表单提交的默认表单操作.

function mySubmitFunction(e) {
  e.preventDefault();
  someBug();
  return false;
}
Run Code Online (Sandbox Code Playgroud)

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

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

function mySubmit(e) { 
  e.preventDefault(); 
  try {
   someBug();
  } catch (e) {
   throw new Error(e.message);
  }
  return false;
}
Run Code Online (Sandbox Code Playgroud)

  • <form onsubmit ="return mySubmitFunction(event)"> working ...必须在firefox的括号中使用单词event (10认同)
  • @BenRowe你应该将evt参数添加到被调用的方法中.`(<form onsubmit ="return mySubmitFunction(evt)">)`.否则它会给出Undefined错误. (5认同)
  • 为什么不直接从`onsumbit`返回`false`? (4认同)
  • 您可能想在 onsubmit 中向用户显示错误消息。例如,“完成此必填字段,然后提交”。在这种情况下 event.preventDefault 将非常方便 (3认同)
  • 我必须在 Chrome 中使用确切的单词“event”作为参数,如果有人为此苦苦挣扎的话。 (3认同)

Rei*_*gel 138

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

<form onsubmit="alert('stop submit'); return false;" >
Run Code Online (Sandbox Code Playgroud)

要么

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

<form onsubmit="return toSubmit();" >
Run Code Online (Sandbox Code Playgroud)

演示

现在,在制作大型项目时,这可能不是一个好主意.您可能需要使用事件监听器.

在此处阅读有关内联事件与事件侦听器(addEventListener和IE的attachEvent)的更多信息.因为我无法解释它比克里斯贝克做的更多.

两者都是正确的,但它们本身都不是"最佳",开发人员可能选择使用这两种方法.

  • 由于某种原因,`&lt;form onsubmit="return false;" &gt;` 对我不起作用。 (3认同)

Mic*_*ski 92

使用事件监听器附加到表单.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.');
});
Run Code Online (Sandbox Code Playgroud)
<form>
  <button type="submit">Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)

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

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

  • +1 不知道为什么所有其他答案都继续使用内联提交,因为 OP 提到他无法更改按钮(这意味着他可能也无法更改表单)。想知道如果我们有按钮 id 是否有办法获得“表单” (3认同)
  • 内联垃圾仍然是投票最多的,但这并不是自 2012 年以来真正的 JS 编程方式?这个解决方案就是解决方案。 (3认同)
  • &amp; 对于 jquery: `$("button").click(function(e) { e.preventDefault() });` (2认同)

小智 14

试试这个......

HTML代码

<form class="submit">
    <input type="text" name="text1"/>
    <input type="text" name="text2"/>
    <input type="submit" name="Submit" value="submit"/>
</form>
Run Code Online (Sandbox Code Playgroud)

jQuery代码

$(function(){
    $('.submit').on('submit', function(event){
        event.preventDefault();
        alert("Form Submission stopped.");
    });
});
Run Code Online (Sandbox Code Playgroud)

要么

$(function(){
    $('.submit').on('submit', function(event){
       event.preventDefault();
       event.stopPropagation();
       alert("Form Submission prevented / stopped.");
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 这个问题中没有jQuery标记. (18认同)
  • @Gothdo是的,它完全一样.eventObject.preventDefault.绑定处理程序的方式不会更改解决方案.我甚至认为你的答案与被接受的答案没有什么不同. (7认同)
  • @Gothdo然而解决方案仍然是一样的.疯了吧? (6认同)
  • @KevinB ...不?-- (3认同)

Vik*_*udi 10

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

<form onsubmit="event.preventDefault(); return validateMyForm();">
Run Code Online (Sandbox Code Playgroud)

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


nai*_*kus 8

var form = document.getElementById("idOfForm");
form.onsubmit = function() {
  return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 即使您通过属性.onsubmit设置了事件处理程序,您仍然可以通过.addEventListener()添加其他处理程序.首先调用属性注册的处理程序,然后按照注册顺序调用.addEventListener()注册的处理程序. (3认同)
  • 我认为使用`.onsubmit`是一个坏主意,因为它阻止您将多个`submit`回调附加到一个元素。我建议使用`.addEventListener()`。 (2认同)

Zuh*_*aha 8

为了防止表单提交,你只需要这样做。

<form onsubmit="event.preventDefault()">
    .....
</form>
Run Code Online (Sandbox Code Playgroud)

通过使用上面的代码,这将阻止您的表单提交。