如何防止按钮提交表单

IT技术 javascript html
2021-01-19 19:42:15

在接下来的页面中,使用 Firefox,删除按钮提交表单,但添加按钮不提交。

如何防止remove按钮提交表单?

function addItem() {
  var v = $('form :hidden:last').attr('name');
  var n = /(.*)input/.exec(v);

  var newPrefix;
  if (n[1].length == 0) {
    newPrefix = '1';
  } else {
    newPrefix = parseInt(n[1]) + 1;
  }

  var oldElem = $('form tr:last');
  var newElem = oldElem.clone(true);
  var lastHidden = $('form :hidden:last');

  lastHidden.val(newPrefix);

  var pat = '=\"' + n[1] + 'input';

  newElem.html(newElem.html().replace(new RegExp(pat, 'g'), '=\"' + newPrefix + 'input'));
  newElem.appendTo('table');
  $('form :hidden:last').val('');
}

function removeItem() {
  var rows = $('form tr');
  if (rows.length > 2) {
    rows[rows.length - 1].html('');
    $('form :hidden:last').val('');
  } else {
    alert('Cannot remove any more rows');
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<html>
<body>
    <form autocomplete="off" method="post" action="">
        <p>Title:<input type="text" /></p>
        <button onclick="addItem(); return false;">Add Item</button>
        <button onclick="removeItem(); return false;">Remove Last Item</button>
        <table>
            <th>Name</th>

            <tr>
                <td><input type="text" id="input1" name="input1" /></td>
                <td><input type="hidden" id="input2" name="input2" /></td>
            </tr>
        </table>
        <input id="submit" type="submit" name="submit" value="Submit">
    </form>
</body>

</html>

6个回答

您正在使用 HTML5 按钮元素。请记住原因是此按钮具有提交的默认行为,如 W3 规范中所述,如下所示: W3C HTML5 Button

所以你需要明确指定它的类型:

<button type="button">Button</button>

为了覆盖默认提交类型。我只想指出发生这种情况的原因。

我还想指出,具有 type 属性(其中一种类型是button )的 HTML 元素不应 f#$'n 具有默认类型submit这简直太愚蠢了,而且是规范中的一个巨大错误。我一直在表单中使用按钮,即使它是一个边缘情况(它不是),将默认类型提交仍然有意义。
2021-03-13 19:42:15
我知道它不会增加任何value,但这是我在 SO 上见过的最好的答案。最简单的解决方案😍
2021-03-15 19:42:15
🤯 这周的大部分时间我都为当我使用表单中的按钮打开一个模态时我的 Electron 应用程序“刷新”而感到恼火。它会发生一次,然后该应用程序的行为符合我的预期。我完全不知道发生了什么。就是这样!我对提交的默认类型没有问题。尽管我花了五年时间才了解它,但这似乎有点问题。
2021-03-29 19:42:15
感谢您的参考,我刚刚了解到表单有一个 type=reset。惊人的!
2021-03-29 19:42:15
我在这里分享情绪。让按钮具有除“按钮”之外的任何其他默认类型只是愚蠢的。因为它完全不直观(并且不可见 - 很难确定 - 因为它是默认设置,不是我添加到元素中的东西)。我花了 2 个小时的大部分时间试图弄清楚为什么在输入框中按“输入”会选择表单中的第一个按钮并单击它。谢谢你的回答!
2021-03-29 19:42:15

在按钮上设置类型:

<button type="button" onclick="addItem(); return false;">Add Item</button>
<button type="button" onclick="removeItem(); return false;">Remove Last Item</button>

...这将阻止他们在事件处理程序中发生异常时触发提交操作。然后,修复您的removeItem()函数,使其不会触发异常:

function removeItem() {
  var rows = $('form tr');
  if ( rows.length > 2 ) {
    // change: work on filtered jQuery object
    rows.filter(":last").html('');
    $('form :hidden:last').val('');
  } else {
    alert('Cannot remove any more rows');
  }
}

请注意更改:您的原始代码从 jQuery 集中提取了一个 HTML 元素,然后尝试对其调用 jQuery 方法 - 这引发了异常,导致按钮的默认行为。

FWIW,还有另一种方法可以解决这个问题......使用jQuery连接你的事件处理程序,并在jQuery的事件对象使用preventDefault()方法来预先取消默认行为:

$(function() // execute once the DOM has loaded
{

  // wire up Add Item button click event
  $("#AddItem").click(function(event)
  {
    event.preventDefault(); // cancel default behavior

    //... rest of add logic
  });

  // wire up Remove Last Item button click event
  $("RemoveLastItem").click(function(event)
  {
    event.preventDefault(); // cancel default behavior

    //... rest of remove last logic
  });

});

...

<button type="button" id="AddItem" name="AddItem">Add Item</button>
<button type="button" id="RemoveLastItem" name="RemoveLastItem">Remove Last Item</button>

这种技术将您的所有逻辑放在一个地方,使其更容易调试......它还允许您通过将type按钮更改submit并处理事件服务器端来实现回退- 这被称为不显眼JavaScript

type="button" 对我来说并不总是在 Firefox 中工作。如果 js 足够复杂,并且出现错误,Firefox 无论如何都会提交表单。疯狂!
2021-03-23 19:42:15
我认为 html 在这里很奇怪。默认情况下它应该是 type="button",而不是提交。看到默认提交总是出乎我的意料。这是个例外。
2021-03-27 19:42:15
@MatthewLock:几乎没有 - 脚本中的错误只会关闭该代码块,然后操作照常进行。尝试调用 jQuery 事件方法 e.preventDefault() 和/或 e.stopPropgation() 作为方法的第一行。请参阅stackoverflow.com/questions/2017755/...了解更多信息
2021-03-31 19:42:15
type=button 无论如何都不应该提交表单
2021-04-01 19:42:15
return false太重要了。有时甚至用于提交按钮(onclick
2021-04-04 19:42:15

前段时间我需要一些非常相似的东西……我得到了它。

所以我在这里介绍的是我如何使用技巧让表单能够由 JavaScript 提交而无需任何验证,并且仅当用户按下按钮(通常是发送按钮)时才执行验证。

例如,我将使用一个最小的表单,只有两个字段和一个提交按钮。

记住什么是想要的:从 JavaScript 必须能够在没有任何检查的情况下提交。但是,如果用户按下这样的按钮,则必须完成验证,并且只有通过验证才能发送表单。

通常,一切都会从这附近的东西开始(我删除了所有不重要的额外内容):

<form method="post" id="theFormID" name="theFormID" action="">
   <input type="text" id="Field1" name="Field1" />
   <input type="text" id="Field2" name="Field2" />
   <input type="submit" value="Send" onclick="JavaScript:return Validator();" />
</form>

看看表单标签是如何没有的onsubmit="..."(记住,没有它是一个条件)。

问题是表单总是被提交,无论是onclick返回true还是false.

如果我更改type="submit"type="button",它似乎有效但无效。它从不发送表单,但这可以轻松完成。

所以最后我使用了这个:

<form method="post" id="theFormID" name="theFormID" action="">
   <input type="text" id="Field1" name="Field1" />
   <input type="text" id="Field2" name="Field2" />
   <input type="button" value="Send" onclick="JavaScript:return Validator();" />
</form>

function Validator, where return True;is 上,我还添加了一个 JavaScript 提交语句,类似于以下内容:

function Validator(){
   //  ...bla bla bla... the checks
   if(                              ){
      document.getElementById('theFormID').submit();
      return(true);
   }else{
      return(false);
   }
}

id=""仅仅是对JavaScriptgetElementByIdname=""仅仅是它出现在POST数据。

以这种方式它可以按我的需要工作。

我把它只用于不需要onsubmit表单上的功能的,但在用户按下按钮时进行一些验证。

为什么我不需要表单标签上的提交?很简单,在其他 JavaScript 部分我需要执行提交,但我不希望有任何验证。

原因:如果用户是执行我想要的提交并需要完成验证的人,但如果是 JavaScript 有时我需要执行提交而这样的验证会避免它。

这听起来可能很奇怪,但在思考例如:在登录时……有一些限制……比如不允许使用 PHP 会话,也不允许使用 cookie!

所以任何链接都必须转换成这样的形式提交,这样登录数据才不会丢失。当尚未完成登录时,它也必须工作。因此不必对链接执行验证。但是,如果用户没有输入用户和通行证这两个字段,我想向用户显示一条消息。所以如果缺少一个,表格一定不能发送!有问题。

看问题:只有当用户按下按钮时,当一个字段为空时,表单不能发送,如果它是 JavaScript 代码,它必须能够发送。

如果我onsubmit对表单标签进行处理,我需要知道它是用户还是其他 JavaScript。由于不能传参数,不能直接传,所以有人加了一个变量来判断是否必须进行验证。验证函数的第一件事是检查变量值等......太复杂了,代码没有说明真正想要什么。

所以解决方案不是在表单标签上有 onsubmit 。Insead 把它放在真正需要的地方,在按钮上。

另一方面,为什么要放置 onsubmit 代码,因为从概念上讲我不想要 onsubmit 验证。我真的想要按钮验证。

不仅代码更清晰,它必须在的地方。请记住这一点: - 我不希望 JavaScript 验证表单(必须始终由 PHP 在服务器端完成) - 我想向用户显示一条消息,告诉所有字段不得为空,需要 JavaScript(客户端边)

那么为什么有些人(思考或告诉我)它必须在 onsumbit 验证中完成?不,从概念上讲,我不会在客户端进行 onsumbit 验证。我只是在按下按钮上做某事,那么为什么不让它实现呢?

好吧,代码和风格完美地解决了这个问题。在我需要发送表单的任何 JavaScript 上:

document.getElementById('theFormID').action='./GoToThisPage.php'; // Where to go
document.getElementById('theFormID').submit(); // Send POST data and go there

当我不需要它时,它会跳过验证。它只是发送表单并加载不同的页面等。

但是,如果用户单击提交按钮(又名type="button"not type="submit"),则在提交表单之前完成验证,如果无效则不发送。

希望这有助于其他人不要尝试冗长而复杂的代码。onsubmit如果不需要就不要使用,并使用onclick. 但是请记住更改type="submit"type="button"并且请不要忘记submit()通过 JavaScript 执行。

我同意 Shog9,但我可能会使用:

<input type = "button" onClick="addItem(); return false;" value="Add Item" />

根据 w3schools<button>标签在不同的浏览器上有不同的行为。

您可以简单地使用 jQuery 获取按钮的引用,并防止其传播,如下所示:

 $(document).ready(function () {
    $('#BUTTON_ID').click(function(e) {

            e.preventDefault();
            e.stopPropagation();
            e.stopImmediatePropagation();

            return false;
    });});
e.preventDefault(); e.stopPropagation();足以让事情发挥作用。e.stopImmediatePropagation()这会在 Chrome 中引发未定义方法的错误。
2021-03-31 19:42:15