如何防止表单从客户端多次提交?

时间:2009-05-29 16:08:45

标签: javascript submit

有时,当响应很慢时,可能会多次单击“提交”按钮。

如何防止这种情况发生?

24 个答案:

答案 0 :(得分:92)

使用不显眼的javascript在表单提交后禁用表单上的提交事件。这是一个使用jQuery的例子。

编辑:修复了在不点击提交按钮的情况下提交表单的问题。谢谢,ichiban。

$("body").on("submit", "form", function() {
    $(this).submit(function() {
        return false;
    });
    return true;
});

答案 1 :(得分:38)

我尝试vanstee's solution以及asp mvc 3不显眼的验证,如果客户端验证失败,代码仍然运行,表单提交被禁用。纠正字段后我无法重新提交。 (见bjan的评论)

所以我修改了vanstee的脚本:

$("form").submit(function () {
    if ($(this).valid()) {
        $(this).submit(function () {
            return false;
        });
        return true;
    }
    else {
        return false;
    }
});

答案 2 :(得分:20)

通过让onsubmit处理程序隐藏提交按钮并将其替换为加载动画,可以非常优雅地实现客户端表单提交控制。这样,用户可以在他的动作(点击)发生的同一地点获得即时视觉反馈。同时,您可以阻止该表单再次提交。

如果您通过XHR提交表单,请记住您还必须处理提交错误,例如超时。您必须再次显示提交按钮,因为用户需要重新提交表单。

另一方面,llimllib提出了一个非常有效的观点。 所有表单验证必须在服务器端进行。这包括多次提交检查。 永远不要相信客户!这不仅仅是javascript被禁用的情况。您必须记住,可以修改所有客户端代码。这有点难以想象,但是与你的服务器通信的html / javascript不一定是你写的html / javascript。

正如llimllib建议的那样,生成具有该表单唯一标识符的表单并将其放入隐藏的输入字段中。存储该标识符。当接收表单数据时,仅在标识符匹配时处理它。 (还将标识符链接到用户会话并匹配,以获得额外的安全性。)数据处理后删除标识符。

当然,偶尔,您需要清理从未提交任何表单数据的标识符。但很可能你的网站已经采用了某种“垃圾收集”机制。

答案 3 :(得分:13)

这是一种简单的方法:

<form onsubmit="return checkBeforeSubmit()">
  some input:<input type="text">
  <input type="submit" value="submit" />
</form>

<script type="text/javascript">
  var wasSubmitted = false;    
    function checkBeforeSubmit(){
      if(!wasSubmitted) {
        wasSubmitted = true;
        return wasSubmitted;
      }
      return false;
    }    
</script>

答案 4 :(得分:12)

<form onsubmit="if(submitted) return false; submitted = true; return true">

答案 5 :(得分:8)

点击后立即停用提交按钮。确保正确处理验证。还要为所有处理或数据库操作保留一个中间页面,然后重定向到下一页。这样可以确保刷新第二页不会进行其他处理。

答案 6 :(得分:5)

您还可以显示进度条或微调器以指示表单正在处理。

答案 7 :(得分:5)

哈希当前时间,使其成为表单上的隐藏输入。在服务器端,检查每个表单提交的哈希值;如果你已经收到了那个哈希,那么你就会重复提交。

编辑:依赖javascript并不是一个好主意,所以你们都可以继续推动这些想法,但有些用户不会启用它。正确答案是不信任服务器端的用户输入。

答案 8 :(得分:5)

使用JQuery,您可以:

$('input:submit').click( function() { this.disabled = true } );

&安培;

   $('input:submit').keypress( function(e) {
     if (e.which == 13) {
        this.disabled = true 
     } 
    }
   );

答案 9 :(得分:4)

我知道你用'javascript'标记了你的问题,但这里的解决方案根本不依赖于javascript:

这是一个名为 PRG 的webapp模式,这里有一个描述它的good article

答案 10 :(得分:4)

您可以通过以下方式阻止多次提交:

var Workin = false;

$('form').submit(function()
{
   if(Workin) return false;
   Workin =true;

   // codes here.
   // Once you finish turn the Workin variable into false 
   // to enable the submit event again
   Workin = false;

});

答案 11 :(得分:3)

您可以尝试使用safeform jquery插件。

$('#example').safeform({
    timeout: 5000, // disable form on 5 sec. after submit
    submit: function(event) {
        // put here validation and ajax stuff...

        // no need to wait for timeout, re-enable the form ASAP
        $(this).safeform('complete');
        return false;
    }
})

答案 12 :(得分:3)

这个问题最简单的答案是:“有时当响应很慢时,可能会多次点击提交按钮。如何防止这种情况发生?”

只需停用表单提交按钮,如下面的代码。

<form ... onsubmit="buttonName.disabled=true; return true;">
  <input type="submit" name="buttonName" value="Submit">
</form>

首次点击提交时,它会停用提交按钮。此外,如果您有一些验证规则,那么它将正常工作。希望它会有所帮助。

答案 13 :(得分:2)

在客户端,您应该在使用javascript代码提交表单后禁用提交按钮,如@vanstee和@chaos提供的方法。

但是网络延迟或javascript禁用情况存在问题,您不应该依赖JS来防止这种情况发生。

因此,在服务器端,您应该检查来自相同客户端的重复提交,并省略重复的提交,这似乎是用户的错误尝试。

答案 14 :(得分:1)

对我来说最简单优雅的解决方案:

function checkForm(form) // Submit button clicked
{
    form.myButton.disabled = true;
    form.myButton.value = "Please wait...";
    return true;
}

<form method="POST" action="..." onsubmit="return checkForm(this);">
    ...
    <input type="submit" name="myButton" value="Submit">
</form>

Link for more...

答案 15 :(得分:1)

在表单中使用此代码。它将处理多次点击。

<script type="text/javascript">
    $(document).ready(function() {
        $("form").submit(function() {
            $(this).submit(function() {
                return false;
            });
            return true;
        });     
    }); 
</script>

它肯定会起作用。

答案 16 :(得分:0)

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="textarea1" contenteditable="true">
  <span id="textarea-placeholder" data-text="Enter comment"></span>
</div>

<div id="textarea2" contenteditable="true">
  <span id="textarea-placeholder" data-text="Enter comment"></span> abc text inside div
  <a></a> //other elements
  <p></p> // other elements
</div>

<div id="textarea3" contenteditable="true">
  <span id="textarea-placeholder" data-text="Enter comment"></span> abc text inside div
</div>

答案 17 :(得分:0)

以前提出的替代方案是:

jQuery('form').submit(function(){
     $(this).find(':submit').attr( 'disabled','disabled' );
     //the rest of your code
});

答案 18 :(得分:0)

这允许每2秒提交一次。如果进行正面验证。

$(document).ready(function() {
    $('form[debounce]').submit(function(e) {
        const submiting = !!$(this).data('submiting');

        if(!submiting) {
            $(this).data('submiting', true);

            setTimeout(() => {
                $(this).data('submiting', false);
            }, 2000);

            return true;
        }

        e.preventDefault();
        return false;
    });
})

答案 19 :(得分:0)

只是在不绕过浏览器输入验证的情况下添加可能的答案

$( document ).ready(function() {
    $('.btn-submit').on('click', function() {
        if(this.form.checkValidity()) {
            $(this).attr("disabled", "disabled");
            $(this).val("Submitting...");
            this.form.submit();
        }
    });
});

答案 20 :(得分:0)

这对我来说非常好。它提交服务器场并禁用按钮,并在2秒后激活按钮。

<button id="submit" type="submit" onclick="submitLimit()">Yes</button>

function submitLimit() {
var btn = document.getElementById('submit')
setTimeout(function() {
    btn.setAttribute('disabled', 'disabled');
}, 1);

setTimeout(function() {
    btn.removeAttribute('disabled');
}, 2000);}

在ECMA6 Syntex中

function submitLimit() {
submitBtn = document.getElementById('submit');

setTimeout(() => { submitBtn.setAttribute('disabled', 'disabled') }, 1);

setTimeout(() => { submitBtn.removeAttribute('disabled') }, 4000);}

答案 21 :(得分:0)

最简单的解决方案是在点击时禁用按钮,在操作完成后启用它。要检查jsfiddle上的类似解决方案:

[click here][1]

您可以在此answer找到其他解决方案。

答案 22 :(得分:0)

使用javascript做这件事有点容易。以下是提供所需功能的代码:

&#13;
&#13;
$('#disable').on('click', function(){
    $('#disable').attr("disabled", true);
  });
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="disable">Disable Me!</button>
&#13;
&#13;
&#13;

答案 23 :(得分:0)

防止多次提交的最佳方法是这样做 只需传递方法中的按钮ID即可。

    function DisableButton() {
        document.getElementById("btnPostJob").disabled = true;
    }
    window.onbeforeunload = DisableButton;