如何防止用户提交表单两次
How to Prevent Users from Submitting a Form Twice
<input type="submit" name="btnADD" id="btnADD" value="ADD"/>
当用户点击添加按钮两次,从得到提交两次相同的数据到表。所以请帮助我限制用户从两次提交。
表单提交后,附加一个jQuery处理程序,劫持并"禁用"提交处理程序:
var $myForm = $("#my_form");
$myForm.submit(function(){
$myForm.submit(function(){
return false;
});
});
从提交处理程序返回"false"将阻止表单提交。禁用按钮会对表单的处理方式产生奇怪的影响。这种方法似乎基本上没有副作用,甚至在有多个提交按钮的表单上也能工作。
试试这段代码…
<input type="submit" name="btnADD" id="btnADD" value="ADD" onclick="this.disabled=true;this.value='Sending, please wait...';this.form.submit();" />
点击按钮后可以禁用或隐藏按钮
<input type="submit" name="btnADD" id="btnADD" value="ADD" onclick="disableButton(this)"/>
js:
function disableButton(button) {
button.disabled = true;
button.value = "submitting...."
button.form.submit();
}
如果你正在使用java服务器端脚本并且也使用struts 2,那么你可以参考这个关于使用token的链接。
http://www.xinotes.org/notes/note/369/应该生成并保存在会话令牌初始页面渲染,当请求提交首次令牌,在struts动作运行一个线程与线程名称标记id和运行逻辑的任何客户端请求,当客户端提交相同的请求,检查是否仍在运行的线程(thread.getcurrentthread () .interrupted)如果仍然运行然后发送端定向503。
和,如果你不使用任何框架和寻找简单的锻炼。你可以求助于
java.util.UUID.randomUUID();
只是把随机uuid在会话中,也在隐藏的表单字段和在另一边(jsp页面,你正在处理其他工作,如存储数据到数据库等)拿出uuid从会话和隐藏的表单字段,如果表单字段匹配比继续,从会话中删除uuid,如果不是,它可能是可能的,表单已被重新提交。
为了你的帮助,我正在写一些代码片段给想法关于如何实现的事情。
<%
String formId=(java.util.UUID.randomUUID()).toString();
session.setAttribute(formId,formId);
%>
<input type='hidden' id='formId' name='formId' value='<%=formId%>'>
你可以通知用户他喝了太多咖啡,但最好是用javascript禁用按钮,例如:
$("#btnADD").on('click', function(btn) {
btn.disabled = true;
});
我根据rogueleaderr的回答做了一个解决方案:
jQuery('form').submit(function(){
jQuery(this).unbind('submit'); // unbind this submit handler first and ...
jQuery(this).submit(function(){ // added the new submit handler (that does nothing)
return false;
});
console.log('submitting form'); // only for testing purposes
});
对于类似的问题,我的解决方案是创建一个单独的、隐藏的提交按钮。它是这样工作的:
- 点击第一个可见按钮。
- 第一个按钮被禁用
-
onclick
导致第二个提交按钮被按下。 - 表单已提交。
<input type="submit" value="Email" onclick="this.disabled=true; this.value='Emailing...'; document.getElementById('submit-button').click();">
<input type="submit" id='submit-button' value="Email" name="btnSubmitSendCertificate" style='display:none;'>
我这样做只是为了让其他从事代码工作的人更清楚。从主观上看,还有其他更好的解决方案。
可以使用JavaScript。
将form.submit.disabled = true;
附加到表单的onsubmit
事件上。
一个精明的用户可以绕过它,但它应该防止99%的用户提交两次。
当点击OK重定向到其他地方时,可以使用带有OK按钮的弹出窗口显示成功消息
禁用提交按钮
$('#btnADD').attr('disabled','disabled');
or
$('#btnADD').attr('disabled','true');
当用户点击提交按钮时禁用该按钮
<form onSubmit="disable()"></form>
function disable()
{
document.getElementById('submitBtn').disabled = true;
//SUBMIT HERE
}
为表单创建一个类,在我的例子中我使用了:_submitlock
$(document).ready(function () {
$(document).on('submit', '._submitlock', function (event) {
// Check if the form has already been submitted
if (!$(this).hasClass('_submitted')) {
// Mark the form as submitted
$(this).addClass('_submitted');
// Update the attributes of the submit buttons
$(this).find('[type="submit"]').attr('disabled', 'disabled');
// Add classes required to visually change the state of the button
$(this).find('[type="submit"]').addClass("buttoninactive");
$(this).find('[type="submit"]').removeClass("buttonactive");
} else {
// Prevent the submit from occurring.
event.preventDefault();
}
});});
在你所有的按钮上添加一个type="submit"的类,例如"button-disable-onsubmit",并使用如下的jQuery脚本:
$(function(){
$(".button-disable-onsubmit").click(function(){
$(this).attr("disabled", "disabled");
$(this).closest("form").submit();
});
});
请记住将此代码保存在通用javascript文件中,以便您可以在许多页面中使用它。这样,它就变成了一个优雅且易于重用的解决方案。此外,您甚至可以添加另一行来更改文本值:
$(this).val("Sending, please wait.");
在表单提交时添加一个类,阻止用户双击/提交
$('form[method=post]').each(function(){
$(this).submit(function(form_submission) {
if($(form_submission.target).attr('data-submitted')){
form_submission.preventDefault();
}else{
$(form_submission.target).attr('data-submitted', true);
}
});
});
你可以添加一个类到你的表单和你的提交按钮,并使用jquery:
$(function() {
// prevent the submit button to be pressed twice
$(".createForm").submit(function() {
$(this).find('.submit').attr('disabled', true);
$(this).find('.submit').text('Sending, please wait...');
});
})
这些解决方案都不适合我,因为我的表单是聊天的,并且还需要重复提交。然而,我很惊讶这里没有提供这个简单的解决方案,它在所有情况下都有效。
var sending = 0;
$('#myForm').submit(function(){
if (sending == 0){
sending++;
// SUBMIT FORM
}else{
return false;
}
setTimeout(function(){sending = 0;},1000); //RESET SENDING TO 0 AFTER ONE SECOND
}
- 在servlet中提交两个表单
- 我如何让我的脚本连续提交两个表单
- 在一次点击中发布到两个表单 JavaScript
- 一次点击,两次'单击'事件已启动
- 只需一个按钮即可在页面上提交两个表单
- HTML5两个表单将分别打印出来
- 使用jQuery组合两个表单输入值
- 两个表单,一个选择/下拉框-需要将选择值从一个表单复制到另一个表单
- 我怎么能只提交两个表单元素
- 收听在同一页面上使用两个表单提交事件
- 两个表单 - 一个提交按钮
- 如何使用一个带有 rails 和 javascript 的提交按钮提交两个表单
- 重置选择的一次表单的操作侦听器
- Angularjs 两个表单用于同一个控制器
- Rails/General HTML:如何从两个表单提交内容
- 如何使用一个 JavaScript 函数管理两个表单
- 尝试在 Bootstrap 中将两个表单并排放置.任何想法如何
- 在php中提交两次表单
- 通过ajax POST提交两次表单
- 验证插件一次处理两个表单,错误