关于按钮或者表单重复提交的问题的一点说法。
浅谈防止表单或者按钮重复点击
今天遇到一个按钮多次点击导致数据重复提交的问题。从前端角度来看,这样首先影响了程序的正确性,其次用户体验很差。 于是开心的打开google。搜索关键字表单 重复 提交打开排名靠前的几篇文章,然后继续搜索prevent form submit twice 后来发现高大上的表述为prevent duclicate submit 闲话不多说,翠花,上代码
<div class="form">
<button href="#" class="save button anchor accept margin-bottom">保存车辆</button>
</div>
原先我的想法是:点击按钮时发送一个ajax请求,把数据传到后台,当请求返回之后提示用户成功或者失败。如果多次点击按钮的话会无疑会产生重复提交的问题
$('.save').on('click', fucntion(){
// 取值
...
// 发送请求
$.ajax({
url: url,
type: 'GET',
data: data,
success: function(data){
if(data.success){
// 提示成功
flash('请求成功');
}else{
// 提示失败
flash('请求失败');
}
}
})
})
修改过后的思路为:当按钮被点击时,把button给禁用掉$('.save').attr('disabled', true)
,同时修改按钮的文字提示用户正在提交
$('.save').on('click', function(){
// 取值
...
// 发送请求
$.ajax({
url: url,
type: 'GET',
data: data,
// 与之前相比变化的地方,在ajax发送之前禁用按钮,修改按钮问题
beforeSend: function(){
$('.save').attr('disabled', true).text('正在提交');
},
success: function(data){
...
}
})
})
至此问题解决,但是解决好问题之后,我们仍然可以来研究一下其他可行的方式。
使用标识符。可以使用cookie,session,data等方式添加标识符。个人推荐使用data,可以封装成为一个插件,代码如下
$.fn.preventDuplicateClick = function(){
$(this).on('click', function(e){
var $btn = $(this);
if($btn.data('submitted') === true){
// 如果已被点击则阻止默认事件,当做一场梦吧
e.preventDefault();
}else{
// 初次点击时,submitted设置为true,防止再次点击
$btn.data('submitted', true);
}
})
// 返回对象本身,保持链式操作
return this;
}
使用时间戳的方式,但是我认为处理提交这类的事件不适合。
提交之后马上跳转页面适合直接提交表单数据的情况,而对于ajax这种异步请求也不是很妥当。
至于后台控制数据重复提交,这点是必要的,但是这样的处理并不能优化用户体验问题。