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 相关文章推荐
很酷的javascript loading效果代码
Jun 18 Javascript
javascript 读取图片文件的大小
Jun 25 Javascript
解析JavaScript中delete操作符不能删除的对象
Dec 03 Javascript
通过JS来动态的修改url,实现对url的增删查改
Sep 01 Javascript
js仿微博实现统计字符和本地存储功能
Dec 22 Javascript
多个js毫秒倒计时同时进行效果
Jan 05 Javascript
基于javascript实现listbox左右移动
Jan 29 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
Jul 14 Javascript
js中判断变量类型函数typeof的用法总结
Aug 09 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
Oct 17 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
Mar 05 Javascript
vue 出现data-v-xxx的原因及解决
Aug 04 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连接Access数据库的方法小结
2013/06/20 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
php多进程应用场景实例详解
2019/07/22 PHP
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
Jquery 实现grid绑定模板
2015/01/28 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
javascript 正则表达式去空行方法
2017/01/24 Javascript
vue路由懒加载的实现方法
2018/03/12 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
JS使用Date对象实时显示当前系统时间简单示例
2018/08/23 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
jquery插件开发模式实例详解
2019/07/20 jQuery
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
省级四好少年事迹材料
2014/01/25 职场文书
十八届三中全会学习方案
2014/02/16 职场文书
离职报告格式
2014/11/04 职场文书
五一放假通知怎么写
2015/08/18 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
修改并编译golang源码的操作步骤
2021/07/25 Golang