WEB 前端开发中防治重复提交的实现方法


Posted in Javascript onOctober 26, 2016

web前端数据请求或者表单提交往往通过对dom的点击事件来操作,但是往往因为认为点击过快(少年手速挺快的嘛),或者因为响应等待使得用户误人为没操作而重复很多次点击,造成表单数据的连续重复提交,造成用户体检的不好,甚至影响到整个系统的安全性。而前端的防治重复提交至少很有效的防治了人为正常操作下的很多不必要麻烦。下面就来讲讲如何有效避免前端的表单重复提交

表单提交有以下几种方式:

<form name=”form” method=”post” action=”#"> 
<input type=”submit” name=”submit” value=”提交"> 
</form>

另外,还有一种常用的方法是使用图片:

代码如下:

<form name=”form” method=”post” action=”# "> 
<input type=”image” name=”submit” src=”btnSubmit.jpg”> 
</form>

第三种是使用链接来提交表单,用到了javascript的DOM模型:

代码如下:

<form name=”form” method=”post” action=”#”> 
<a href=”javascript:form.submit();”>提交</a> 
</form>

实际上这一种是通过js 进行提交。可以理解成 

$("form").find("a").click(function(){
$("form").submit();
});

第一种和第二种可以用js来:

$("input[type='submit']").click(function(){

$("form").submit();

});
$("input[name='submit']").click(function(){


$("form").submit();

});

总之,都是对form进行提交,当然还有出了表单提交还有些请求也要防治重复,比如响应某个事件的ajax请求(提交数据)

$.ajax({
url: url,
type: "post",
data: data,
success: function (data) {
callback;
}
});

那么前面这些提交和请求在网络和性能因素上导致不能及时网络响应并且在事件多次响应时造成的重复,除非在提交响应完成前的点击(触发事件)视为无效,等当前响应完了再去响应下一个请求

如果是表单按钮我们可以这样在点击后将按钮disabled掉

$("input[type='submit']").click(function(){
$(this).attr("disabled", true);
 $("form").submit();
});

按道理来说,将点击后将按钮disabled设为true时按钮就不能点击了那么第二次以后点击就无效了,但这样做你会发现同时第一次点击的表单也无法正常提交了(好像是h5的标准后才不行的,无论怎样h5标准的浏览器我试了试都不行),看来是disabled影响了表单的提交,那么先提交后disabled看行不行

$("input[type='submit']").click(function(){
 $("form").submit();
$(this).attr("disabled", true);
});

实验结果 ,这样也不行,我们不能猜想submit()回调在click函数最后执行并且.submit()函数内部应该对disabel做了判断(假设这是浏览器内部机制原理),反正在当前这个交互周期里disabled了就不能submit

那么我们可以抛开disabled用代码逻辑来防治重复

$("input[type='submit']").click(function(){
if(!$(this)[0].repeat){
$(this)[0].repeat=true;
$("form").submit();
}
});

在当前点击的按钮如果没有repeat的话就进入提交并且设置个值为true的repeat属性,当第二次进来的时候发现有这个属性就不提交,看似这样的逻辑会防治重复提交了,但是事实永远都是残酷的!

是的,当点击过快的时候还是会重复提交,这是因为,如果click里没执行submit的时候html默认的type=submit 的input点击操作会提交表单,举个完整的例子

<form name=”form” method=”post” action=”#"> 
<input type=”submit” name=”submit” value=”提交"> 
</form>
<form name=”form” method=”post” action=”#"> 
<input type=”submit” name=”submit” value=”提交"> 
</form>
$("input[type='submit']").click(function(){
console.log("here is click too!");
});
<form name=”form” method=”post” action=”#"> 
<div>提交</div> 
</form>
$("form").find("div").click(function(){
$("form").submit();
});

这三个代码都是一个效果提交表单,但是!!!!!!!!!!我们发现阻止表单提交的不就是在当前交互周期(一次点击-》响应-》回调)里,将submit按钮disabled掉吗,好的,少年上代码

$("form").find("div").click(function(){
if(!$(this)[0].repeat){ 
 $(this)[0].repeat=true;

$(this).closest("form").submit();
}else{

 $(this).attr("disabled", true); }
});

看到没有,第二次点击的时候就disabeld掉了,所以只有第一次成功,第二次的就不会提交了!

当然,如果是其他dom元素防治重复点击那就更简单了

$("div").click(function(){
if(!!$(this)[0].isRepeat){


return;

}
$(this)[0].isRepeat=1;

  $.ajax({
url: url,
type: "post",
data: data,
success: function (data) {




$(this)[0].isRepeat=0;




callback; 



} 
  }); 
});

因为submit()会刷新试图,而ajax不会,所以在回调后需要把判断重复的那个属性赋值为false

这是不是就更简单?我想你会这样认为的!

以上所述是小编给大家介绍的JS WEB 前端开发中防治重复提交的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS实现悬浮移动窗口(悬浮广告)的特效
Mar 12 Javascript
js调用css属性写法
Sep 21 Javascript
javascript从右边截取指定字符串的三种实现方法
Nov 29 Javascript
javascript url几种编码方式详解
Jun 06 Javascript
JS中常用的输出方式(五种)
Jun 12 Javascript
JS简单实现仿百度控制台输出信息效果
Sep 04 Javascript
vue 的keep-alive缓存功能的实现
Mar 22 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
Jan 18 Javascript
微信小程序实现获取小程序码和二维码java接口开发
Mar 29 Javascript
微信小程序:数据存储、传值、取值详解
May 07 Javascript
在VUE中实现文件下载并判断状态的方法
Nov 08 Javascript
基于原生js实现判断元素是否有指定class名
Jul 11 Javascript
jquery+css3问卷答题卡翻页动画效果示例
Oct 26 #Javascript
简单的js计算器实现
Oct 26 #Javascript
利用python分析access日志的方法
Oct 26 #Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
Oct 26 #Javascript
关于Jquery中的事件绑定总结
Oct 26 #Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
Oct 25 #Javascript
理解JavaScript原型链
Oct 25 #Javascript
You might like
php生成PDF格式文件并且加密
2015/06/22 PHP
分享PHP守护进程类
2015/12/30 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
Vuex 入门教程
2018/01/10 Javascript
React如何避免重渲染
2018/04/10 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
2018/02/21 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
python实现音乐下载的统计
2018/06/20 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
盛大二次面试题
2016/11/18 面试题
应聘医药销售自荐书范文
2014/02/08 职场文书
教师师德反思材料
2014/02/15 职场文书
浪费资源的建议书
2014/03/12 职场文书
反对邪教标语
2014/06/30 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
债务纠纷委托书
2014/08/30 职场文书
严以律己学习心得体会
2016/01/13 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书