28

我一直在努力寻找防止重复提交表单的“正确”方法。SO上有很多相关的帖子,但没有一个对我有用。下面两个问题。

这是我的表格

<form method="POST">
    <input type="text" name="q"/>
    <button class="once-only">Send</button>
</form>

这是我第一次尝试禁用双重提交:

$(document).ready(function(){
    $(".once-only").click(function(){
        this.disabled = true;
        return true;
    });
});

这是此处建议的方法:使用 JS/Jquery 发布后禁用按钮。该帖子建议提交元素必须是输入而不是按钮,但测试两者没有区别。您可以使用这个小提琴自己尝试:http: //jsfiddle.net/uT3hP/

如您所见,这会禁用按钮,但也会阻止提交表单。在提交元素是按钮和输入元素的情况下。

问题1:为什么这个点击处理程序会停止提交表单?

搜索更多我找到了这个解决方案(来自Why doesn't my form post when I disable the submit button to prevent double click?

if($.data(this, 'clicked')){
    return false;
} else{
    $.data(this, 'clicked', true);
    return true;
}

你可以用这个小提琴玩这个:http: //jsfiddle.net/uT3hP/1/

这确实有效,但是...

问题2: 这是我们能做的最好的吗?

我认为这将是一个基本的事情。方法 1 不起作用,方法 2 起作用,但我不喜欢它,感觉必须有更简单的方法。

4

5 回答 5

46

简单有效的解决方案是

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

来源:这里

于 2016-07-16T22:58:12.353 回答
37

您可以使用 jQuery 的submit()。在这种情况下,它应该看起来像这样:

$('form').submit(function(){
    $(this).children('input[type=submit]').prop('disabled', true);
});

这是一个有效的 jsFiddle(由 Mike 制作) - http://jsfiddle.net/gKFLG/1/

如果您的提交按钮不是表单元素的直接子元素,则需要替换childrenfind. 此外,您的提交按钮也可能是一个button元素而不是一个input元素。例如,如果您使用Bootstrap 水平表单,就会出现这种情况。以下是片段的不同版本:

$('form').submit(function(){
    $(this).find('button[type=submit]').prop('disabled', true);
});

演示 jsFiddle - http://jsfiddle.net/devillers/fr7gmbcy/

于 2013-03-20T16:55:29.980 回答
4

同样,我已经看到了一些示例,这个示例允许您通过超时来更改按钮被禁用的时间。它也只触发表单提交而不是按钮单击事件,这最初给我带来了一些问题。

    $('form').submit(function () {
        var button = $('#button');
        var oldValue = button.value;
        var isDisabled = true;

        button.attr('disabled', isDisabled);

        setTimeout(function () {
            button.value = oldValue;
            button.attr('disabled', !isDisabled);
        }, 3000)
    });
于 2017-03-21T16:48:33.327 回答
2

您可以尝试使用以下代码:

$(document).ready(function(){
   $(".once-only").click(function(){
      this.submit();
      this.disabled = true;
      return true;
   });
});
于 2013-03-20T16:56:46.043 回答
2

这应该有助于:

<form class="form-once-only" method="POST">
    <input type="text" name="q"/>
    <button type="submit" class="once-only">Send</button>
</form>

Javascript:

$(document).ready(function(){
    $("form.form-once-only").submit(function () {
        $(this).find(':button').prop('disabled', true);
    });
}
于 2013-03-20T17:03:27.480 回答