有时,当响应缓慢时,人们可能会多次单击“提交”按钮。
如何防止这种情况发生?
有时,当响应缓慢时,人们可能会多次单击“提交”按钮。
如何防止这种情况发生?
Answers:
在提交事件后,请使用不吸引人的javascript禁用表单上的Submit事件。这是使用jQuery的示例。
编辑:修复了不单击提交按钮即可提交表单的问题。谢谢,一番
$("body").on("submit", "form", function() {
$(this).submit(function() {
return false;
});
return true;
});
return true
吗?我认为最初的提交应该可以做到这一点。
return true
如果省略则暗含。
$(this).find("input[type='submit']").attr('disabled', 'disabled').val('submiting'); return true; });
我尝试了Vanstee的解决方案以及ASP MVC 3非侵入式验证,并且如果客户端验证失败,代码仍将运行,并且表单提交将被永久禁用。更正字段后,我无法重新提交。(请参阅bjan的评论)
因此,我修改了vanstee的脚本,如下所示:
$("form").submit(function () {
if ($(this).valid()) {
$(this).submit(function () {
return false;
});
return true;
}
else {
return false;
}
});
通过使onsubmit处理程序隐藏“提交”按钮并将其替换为加载动画,可以非常优雅地实现客户端表单提交控制。这样,用户可以在操作(点击)发生的同一位置立即获得视觉反馈。同时,您可以防止再次提交该表单。
如果您通过XHR提交表单,请记住,您还必须处理提交错误,例如超时。您将不得不再次显示“提交”按钮,因为用户需要重新提交表单。
另一方面,llimllib提出了一个非常有效的观点。所有表单验证都必须在服务器端进行。这包括多次提交检查。永远不要相信客户!这不仅是禁用javascript的情况。您必须记住,所有客户端代码都可以修改。很难想象,但是与服务器通信的html / javascript不一定是您编写的html / javascript。
正如llimllib所建议的那样,生成具有该表单唯一的标识符的表单,并将其放在隐藏的输入字段中。存储该标识符。当接收表单数据时,仅当标识符匹配时才对其进行处理。(还可以将标识符链接到用户会话,并对其进行匹配,以提高安全性。)在数据处理之后,删除标识符。
当然,有时需要清理从未提交过任何表单数据的标识符。但是很可能您的网站已经采用某种“垃圾收集”机制。
这是执行此操作的简单方法:
<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>
单击后立即禁用提交按钮。确保正确处理验证。同时为所有处理或数据库操作保留一个中间页面,然后重定向到下一页。这可以确保刷新第二页不会进行其他处理。
form page ---submits to---> form_submission_script.php ---after saving, redirects to---> form_thankyou.html
散列当前时间,使其成为表单上的隐藏输入。在服务器端,检查每个表单提交的哈希;如果您已经收到该哈希,则需要重复提交。
编辑:依靠javascript不是一个好主意,因此所有人都可以继续支持那些主意,但是有些用户不会启用它。正确的答案是不信任服务器端的用户输入。
使用JQuery,您可以执行以下操作:
$('input:submit').click( function() { this.disabled = true } );
和
$('input:submit').keypress( function(e) {
if (e.which == 13) {
this.disabled = true
}
}
);
您可以使用以下命令阻止多次提交:
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;
});
Workin =true;
。仍然可以进行两次提交,但提交的次数可能更少。
对这个问题的最简单的回答是:“有时响应很慢,可能会多次单击“提交”按钮。如何防止这种情况发生?”
只需禁用表单提交按钮,如下面的代码。
<form ... onsubmit="buttonName.disabled=true; return true;">
<input type="submit" name="buttonName" value="Submit">
</form>
第一次单击提交时,它将禁用提交按钮。另外,如果您有一些验证规则,那么它将正常工作。希望它会有所帮助。
在客户端,一旦使用javascript代码提交表单(如@vanstee和@chaos提供的方法),则应禁用“提交”按钮。
但是对于网络延迟或禁用JavaScript的情况存在问题,即您不应该依赖JS来防止这种情况的发生。
因此,在服务器端,您应该检查来自同一客户端的重复提交,并忽略重复的提交,这似乎是用户的错误尝试。
您可以尝试使用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;
}
})
对我来说,最简单,最优雅的解决方案是:
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>
这允许每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;
});
})
这对我来说很好。它提交服务器场并禁用按钮,并在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);}
以前提出的替代方案是:
jQuery('form').submit(function(){
$(this).find(':submit').attr( 'disabled','disabled' );
//the rest of your code
});