如何防止表单被提交?

Posted

技术标签:

【中文标题】如何防止表单被提交?【英文标题】:How to prevent form from being submitted? 【发布时间】:2011-03-21 23:37:48 【问题描述】:

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

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

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

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

【问题讨论】:

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

你可以像这样使用内联事件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 解释更多。

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

【讨论】:

不错,路上快速解决。 由于某种原因,&lt;form onsubmit="return false;" &gt; 对我不起作用。【参考方案2】:
var form = document.getElementById("idOfForm");
form.onsubmit = function() 
  return false;

【讨论】:

我认为使用.onsubmit 是个坏主意,因为它会阻止您将多个submit 回调附加到一个元素。我推荐使用.addEventListener() 即使您已经通过属性 .onsubmit 设置了事件处理程序,您仍然可以通过 .addEventListener() 添加其他处理程序。属性注册的处理程序将首先被调用,然后按照注册顺序调用 .addEventListener() 注册的处理程序。【参考方案3】:

与其他答案不同,return 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 会派上用场 @ProfK 如果你使用 event.preventDefault() 没关系,try/catch 只是你错误处理的一部分
工作......不得不在firefox的括号中使用单词event
@BenRowe 您应该将 evt 参数添加到被调用的方法中。 (&lt;form onsubmit="return mySubmitFunction(evt)"&gt;)。否则会给出未定义的错误。【参考方案4】:

试试这个...

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 是唯一对我有用的东西。谢谢! :)【参考方案5】:

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

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

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

【讨论】:

onsubmit="return validateMyForm();"就足够了,但 validateMyForm() 应该返回 true 或 false。【参考方案6】:

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

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

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

$(function() 
    var $form = $('#my-form');
    $form.removeAttr('onsubmit');
    $form.submit(function(ev) 
        // quick validation example...
        $form.children('input[type="text"]').each(function()
            if($(this).val().length == 0) 
                alert('You are missing a field');
                ev.preventDefault();
            
        );
    );
);
label 
    display: block;


#my-form > input[type="text"] 
    background: cyan;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="my-form" action="http://google.com" method="GET" onsubmit="return false;">
    <label>Your first name</label>
    <input type="text" name="first-name"/>
    <label>Your last name</label>
    <input type="text" name="last-name" /> <br />
    <input type="submit" />
</form>

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

【讨论】:

【参考方案7】:

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

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>

我认为这是一个比在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 树中都是唯一的,并且验证器会在它出现时捕获不是。【参考方案8】:

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

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

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

【讨论】:

【参考方案9】:

这是我的答案:

<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(); 并且它有效。

【讨论】:

【参考方案10】:

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

const formToJSON = elements => [].reduce.call(elements, (data, element) => 
  data[element.name] = element.value;
  return data;

, );

const handleFormSubmit = event => 
    event.preventDefault();
    const data = formToJSON(form.elements);
    console.log(data);
  //  const odata = JSON.stringify(data, null, "  ");
  const jdata = JSON.stringify(data);
    console.log(jdata);

    (async () => 
      const rawResponse = await fetch('/', 
        method: 'POST',
        headers: 
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        ,
        body: jdata
      );
      const content = await rawResponse.json();

      console.log(content);
    )();
;

const form = document.forms['myForm']; 
form.addEventListener('submit', handleFormSubmit);
<form id="myForm" action="/" method="post" accept-charset="utf-8">
    <label>Checkbox:
        <input type="checkbox" name="checkbox" value="on">
    </label><br /><br />

    <label>Number:
        <input name="number" type="number" value="123" />
    </label><br /><br />

    <label>Password:
        <input name="password" type="password" />
    </label>
    <br /><br />

    <label for="radio">Type:
        <label for="a">A
            <input type="radio" name="radio" id="a" value="a" />
        </label>
        <label for="b">B
            <input type="radio" name="radio" id="b" value="b" checked />
        </label>
        <label for="c">C
            <input type="radio" name="radio" id="c" value="c" />
        </label>
    </label>
    <br /><br />

    <label>Textarea:
        <textarea name="text_area" rows="10" cols="50">Write something here.</textarea>
    </label>
    <br /><br />

    <label>Select:
        <select name="select">
            <option value="a">Value A</option>
            <option value="b" selected>Value B</option>
            <option value="c">Value C</option>
        </select>
    </label>
    <br /><br />

    <label>Submit:
        <input type="submit" value="Login">
    </label>
    <br /><br />


</form>

【讨论】:

以上是关于如何防止表单被提交?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止表单提交在字段上点击输入? [复制]

如何防止表单的重复提交

如何防止HTMLFormElement.submit()调用表单提交[重复]。

php防止用户重复提交表单

php中如何防止刷新一次提交一次

如何防止按钮提交表单