ChatGPT解决这个技术问题 Extra ChatGPT

如何防止表单被提交?

我有一个表单,其中某处有一个提交按钮。

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

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

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

您仍然可以访问提交按钮。渲染页面并通过查看页面源获取其 ClientID。然后,使用像 jQuery 这样的东西,你可以做类似 $('#ctl01_cph01_controlBtn1').click(function() {return false;});
@Rafael:是的......但这将是最后的手段 - 这是一个非常复杂的控制。
@Raf 这是基于 asp.net 的,也不是最佳实践。但它本质上是正确的。我只是避免偷看源代码并使用控件名称,因为如果有人编辑页面,它可能会改变。意外的副作用等。

S
Saabbir

与其他答案不同,返回 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;
}

为什么不直接从 onsumbit 返回 false
您可能希望在 onsubmit 中向用户显示错误消息。例如,“完成此必填字段然后提交”。在这种情况下 event.preventDefault 会派上用场
工作......必须在firefox的括号中使用单词event
@BenRowe您应该将 evt 参数添加到被调用的方法中。 (<form onsubmit="return mySubmitFunction(evt)">) .否则会给出未定义的错误。
我不得不使用确切的词 event 作为 Chrome 中的参数,就像有人在努力解决这个问题一样。
9
9 revs, 3 users 73%

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

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

或者

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

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

Demo

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

read more about Inline Events vs Event Listeners (addEventListener and IE's attachEvent) here。因为我无法比 Chris Baker 解释更多。

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


很好,在路上快速解决。
出于某种原因,<form onsubmit="return false;" > 对我不起作用。
M
Michał Perłakowski

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

常量元素 = document.querySelector('form'); element.addEventListener('submit', event => { event.preventDefault(); // 实际逻辑,例如验证表单 console.log('Form submit cancelled.'); });

我认为这比定义与 onsubmit 属性内联的 submit 事件处理程序更好,因为它分离了网页逻辑和结构。维护逻辑与 HTML 分离的项目要容易得多。请参阅:Unobtrusive JavaScript

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


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

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

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

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


onsubmit="return validateMyForm();"就足够了,但 validateMyForm() 应该返回 true 或 false。
T
ThePierrasse

试试这个...

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.");
    });
});

这个问题中没有 jQuery 标签。
@Gothdo,但解决方案仍然相同。疯了吧?
@Gothdo 是的,完全一样。 eventObject.preventDefault。绑定处理程序的方式不会改变解决方案。我什至会争辩说你的答案与接受的答案没有什么不同。
stopPropagation 是唯一对我有用的东西。谢谢! :)
n
naikus
var form = document.getElementById("idOfForm");
form.onsubmit = function() {
  return false;
}

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

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

<form onsubmit="event.preventDefault()">
    .....
</form>

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


d
de-russification

要遵循 unobtrusive JavaScript 编程约定,并根据 DOM 的加载速度,最好使用以下内容:

<form onsubmit="return false;"></form>

如果您正在使用库,则使用 onload 或 DOM 准备好连接事件。

$(function() { var $form = $('#my-form'); $form.removeAttr('onsubmit'); $form.submit(function(ev) { // 快速验证示例... $form .children('input[type="text"]').each(function(){ if($(this).val().length == 0) { alert('你缺少一个字段'); ev .preventDefault(); } }); }); });标签{显示:块; } #my-form > input[type="text"] { 背景:青色; }


另外,我总是使用 action 属性,因为有些人可能会运行一些像 NoScript 这样的插件,这会破坏验证。如果您使用 action 属性,至少您的用户将被服务器基于后端验证重定向。另一方面,如果您使用 window.location 之类的东西,情况会很糟糕。


H
Hasan A Yousef

您可以将 eventListner 添加到表单中,即 preventDefault() 并将表单数据转换为 JSON,如下所示:

const formToJSON = elements => [].reduce.call(elements, (data, element) => { data[element.name] = element.value; return data; }, {}); const handleFormSubmit = event => { event.preventDefault();常量数据 = formToJSON(form.elements);控制台.log(数据); // const odata = JSON.stringify(data, null, " ");常量 jdata = JSON.stringify(数据);控制台.log(jdata); (async () => { const rawResponse = await fetch('/', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },正文:jdata }); const content = await rawResponse.json(); console.log(content); })(); }; const form = document.forms['myForm']; form.addEventListener('submit', handleFormSubmit);
















d
devugur
<form v-on:submit.prevent="yourMethodHere">

提交事件将不再重新加载页面。它运行你的方法。

来自 Vue 文档:https://vuejs.org/guide/essentials/event-handling.html#event-modifiers


请阅读How do I write a good answer?。虽然此代码块可能会回答 OP 的问题,但如果您解释此代码与问题中的代码有何不同、您已更改的内容、更改的原因以及解决问题的原因,则此答案会更有用没有介绍别人。
y
yozawiratama

这是我的回答:

<form onsubmit="event.preventDefault();searchOrder(event);">
...
</form>
<script>
const searchOrder = e => {
    e.preventDefault();
    const name = e.target.name.value;
    renderSearching();

    return false;
}
</script>

我在 onsubmit 上添加 event.preventDefault(); 并且它有效。