我一直试图找到"对"防止双重提交表格的方法。 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;
});
});
这是此处建议的方法:Disable button after post using JS/Jquery。该帖子表明提交元素必须是输入而不是按钮,但测试两者没有区别。您可以使用这个小提琴自己尝试:http://jsfiddle.net/uT3hP/
如您所见,这会禁用该按钮,但也会阻止提交表单。如果提交元素是按钮和输入元素。
问题1:为什么此点击处理程序会停止提交表单?
搜索更多我找到此解决方案(来自Why doesn't my form post when I disable the submit button to prevent double clicking?)
if($.data(this, 'clicked')){
return false;
} else{
$.data(this, 'clicked', true);
return true;
}
你可以使用这个小提琴来玩这个:http://jsfiddle.net/uT3hP/1/
这确实有效,但是......
问题2:这是我们能做的最好的事情吗?
我认为这将是一件基本的事情。方法1不起作用,方法2不起作用,但我不喜欢它并感觉必须有一种更简单的方法。
答案 0 :(得分:27)
您可以使用jQuery的submit()。在这种情况下,它看起来应该是这样的:
$('form').submit(function(){
$(this).children('input[type=submit]').prop('disabled', true);
});
这是一个有效的jsFiddle(由Mike制作) - http://jsfiddle.net/gKFLG/1/。
如果您的提交按钮不是表单元素的直接子项,则需要将children
替换为find
。此外,您的提交按钮也可能是button
元素,而不是input
元素。例如。如果您使用的是Bootstrap horizontal forms,则会出现这种情况。以下是该代码段的不同版本:
$('form').submit(function(){
$(this).find('button[type=submit]').prop('disabled', true);
});
演示jsFiddle - http://jsfiddle.net/devillers/fr7gmbcy/
答案 1 :(得分:14)
简单有效的解决方案
<form ... onsubmit="myButton.disabled = true; return true;">
...
<input type="submit" name="myButton" value="Submit">
</form>
来源:here
答案 2 :(得分:2)
同样我已经看过几个例子,这个例子允许你通过超时改变按钮被禁用的时间。它也只触发表单提交而不是按钮点击事件,这最初引起了一些问题。
$('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)
});
答案 3 :(得分:1)
您可以尝试使用以下代码:
$(document).ready(function(){
$(".once-only").click(function(){
this.submit();
this.disabled = true;
return true;
});
});
答案 4 :(得分:1)
这应该有所帮助:
<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);
});
}