在网页开发过程中经常遇到点击按钮之后提交表单且不能重复提交表单的问题,我总结了一下常用的解决办法:
下面模拟整个过程:
<html> <head> <title>测试</title> <meta charset="utf-8"> </head> <body> <form> <input id="btn-submit" type="button" value="提交"> </form> </body> <script> function fncSubmit(){ setTimeout(function(){ alert('提交表单'); },1000); } document.getElementById('btn-submit').onclick = fncSubmit; </script> </html>
1 原生js控制
提交按钮点击之后,禁用按钮
function fncSubmit(){ setTimeout(function(){ alert('提交表单'); },1000); this.disabled = true; }
触发点击事件之后,覆盖原来的点击事件方法
function fncSubmit(){ setTimeout(function(){ alert('提交表单'); },1000); this.onclick = function(){}; }
给按钮添加变量标志
function fncSubmit(){ if(!this.isSubmit){ setTimeout(function(){ alert('提交表单'); },1000); } this.isSubmit = true; }
2 jquery 解绑点击事件
触发点击事件之后,在方法内解绑jquery对象的绑定事件
$(function(){ $('#btn-submit').click(function(){ setTimeout(function(){ alert('提交表单') }); $(this).unbind('click',arguments.callee); }); });
另一个思路是获取并记录时间,当再次点击时,时间间隔大于1s时才有效
$("#btn-submit").click(function(){ varlast=Date.now(); returnfunction(){ varnow=Date.now(); if((now-last)>1000){ btn.innerHTML=Number(btn.innerHTML)+1; } last=now; } })();
附:防止ajax重复提交请求的解决方法
一、造成重复提交原因
由于AJAX提交数据为异步提交,所以当我们点击提交按钮是通过xmlhttprequest向服务器发送异步请求,发送请求需要有处理时间,我们第一次点击的请求尚未完成,就有接二连三的又提交了几次,同时后来发送的请求同事也被发送到后台处理了,这种情况如果是数据读取则不会有太大影响,但是涉及到数据提交保存或者提交之后多表数据处理就更麻烦了,所以此种情况务必要避免,免得给大家造成麻烦。
二、重复提交解决办法
1、如果提交对象为按钮的话,可以对按钮设置disabled,此办法适应于按钮提交,此种方法简单粗暴,也是很多人用的办法,代如下:
$("input[type=submit]").attr('disabled',true)//在按钮提交之后和AJAX提交之前将按钮设置为禁用 $.ajax({ url:'/post.php' data:{a:1,b,1} success:function(){ $("input[type=submit]").attr('disabled',false)//在提交成功之后重新启用该按钮 }, error: function(){ $("input[type=submit]").attr('disabled',false)//即使AJAX失败也需要将按钮设置为可用状态,因为有可能是网络问题导致的失败,所以需要将按钮设置为可用 } })
经过以上对按钮的处理就避免了重复提交的问题
2、非按钮对象提交
有时候我们在提交数据的时候没有from,只有单个表单组件(input、textarea、radio、checkbox等),所以我们就可以将任何一个对象设置提交对象来完成提交,由于普通对象没有disabled属性,所以我们需要用其它方式来防止重复提交
var post_flag = false; //设置一个对象来控制是否进入AJAX过程 function post(){ if(post_flag) return; //如果正在提交则直接返回,停止执行 post_flag = true;//标记当前状态为正在提交状态 $.ajax({//进入AJAX提交过程 url:'/post.php' data:{a:1,b,1} success:function(){ post_flag =false; //在提交成功之后将标志标记为可提交状态 }, error: function(){ post_flag =false; //AJAX失败也需要将标志标记为可提交状态 } }) }有了上面的方法,大部分执行重复异步请求的问题都会解决,办法已经教给大家了,希望对新手童鞋有帮助。