【问题标题】:Prevent double submission AND allow "required" fields防止重复提交并允许“必填”字段
【发布时间】:2018-09-22 08:38:22
【问题描述】:

从一个需要电子邮件地址的简单表单开始:

<form action="NextPage.php" method="post">
    <input type="email" name="contact[email]" required id="frmEmailA" autocomplete="email">
    <button type="submit">Submit</button>
</form>

(出于故障排除目的,标签和其他字段等非必要功能已被删除。)

前段时间,我遇到了重复提交的问题。我记得尝试过许多不同的解决方案,但我发现只有一个可行的解决方案here。

所以,我实现了那个解决方案:

<form action="NextPage.php" method="post">
    <input type="email" name="contact[email]" required id="frmEmailA" autocomplete="email">
    <button type="submit" onclick="this.form.submit(); this.disabled = true;">Submit</button>
</form>

这是一个多月前的事了,直到现在我都忘记了。 “必需”属性现在没有任何作用,因为 this.form.submit(); 似乎覆盖了 required。

这个问题的很多解决方案都需要很多插件或额外的功能,但是有没有一个优雅的解决方案?

最优雅的解决方案可能是纯 html,但我希望我也需要 javascript。如果可能的话,我想避免下载库或安装插件。

例子:

我想要的只是一个不会在双击时提交两次并尊重required 属性的表单。理想情况下,无需学习新的库或标记语言。如果需要,我不介意编写几个冗长的 javascript 函数。即使是重定向到下一页的页面也不会太不雅。

(我也知道 PHP 和 SQL,但我认为它们都不会在这里提供帮助。)

这可能吗?

【问题讨论】:

  • 投反对票且不发表评论?我正在努力写出我能写出的最好的问题。如果有人对如何改进这个或重复的地方有指导,我将不胜感激。

标签: javascript html


【解决方案1】:

不要在按钮的onclick 属性中禁用按钮,而是在表单的onsubmit 属性中禁用它。

您需要为提交按钮命名,然后您可以在onsubmit 属性中将其称为this.&lt;name&gt;。或者你可以给它一个ID,然后你可以使用document.getElementById("&lt;id&gt;")来引用它。

<form action="NextPage.php" method="post" onsubmit="this.submitButton.disabled = true;">
  <input type="email" name="contact[email]" required id="frmEmailA" autocomplete="email">
  <button type="submit" name="submitButton">Submit</button>
</form>

您的代码需要调用this.form.submit() 的原因是单击禁用的按钮不会触发默认表单提交。但是如果你将禁用代码放在onsubmit 属性中,它只会在表单提交过程开始后运行。

【讨论】:

  • 这确实是一个非常优雅的解决方案。我会给它一个测试,如果它有效,我会给你一个赞成票和绿色勾号。
  • 好的,从真实项目中精确复制/粘贴:&lt;form action="CreateOrder.php" method="post" onsubmit="this.submitButton.disabled = true;"&gt; 我删除了onclick="this.form.submit(); this.disabled = true;" 双击仍然会导致重复提交。我做错了什么?
  • 您是否在按钮上添加了name="submitButton"?
  • 啊,有区别吗?好的,现在可以了。我不知道为什么,但我很高兴它有效。
  • 在一个表单中,所有被命名的元素都是表单元素的属性。所以this.submitButton 指的是带有name="submitButton" 的元素。
【解决方案2】:

对于 jQuery 粉丝:

$('form').submit(function(){
   $(':submit').attr('disabled','disabled');
});

【讨论】:

    猜你喜欢
    • 2012-03-29
    • 2014-03-28
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2015-05-27
    • 2014-03-07
    相关资源
    最近更新 更多