web前端防治重复提交

web前端开发中防治重复提交

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

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

时间: 2024-10-08 03:32:59

web前端防治重复提交的相关文章

6个漂亮的Web前端表单提交以及搜索框(下)

4.jQuery圆形修边注册表单 能在支持 FireFox.Chrome.Safari.傲游.搜狗.360浏览器. 源码下载/  在线演示 5.  HTML5超酷表单展示效果 源码下载  /  在线演示 6.  纯CSS3实现的紫色登录表单 源码下载 /  在线演示 6个漂亮的Web前端表单提交以及搜索框(下)

6个漂亮的Web前端表单提交以及搜索框(上)

1. 纯CSS3实现动画搜索框 源码下载  /  在线演示 2.  js text文本框字数限制 源码下载 /  在线演示 3.jQuery动态下拉登陆提示框 源码下载/   在线演示 6个漂亮的Web前端表单提交以及搜索框(上)

前端防重复提交(节流函数)

应用情景 经典使用情景:js的一些事件,比如:onresize.scroll.mousemove.mousehover等: 还比如:手抖.手误.服务器没有响应之前的重复点击: 这些都是没有意义的,重复的无效的操作,设置对整个系统的影响还可能是致命的,所以我们要对重复点击的事件进行相应的处理! 节流函数 所谓的节流函数顾名思义,就是某个时刻限制函数的重复调用. 同样节流函数也是为了解决函数重复提交的问题,而防止重复提交的方法,不止节流函数一种实现. 方法汇总 本文整理了我在工作实践当中,觉的防止j

前端防止重复提交btnLimit.js

$(function() { $(".btn").each(function() { $(this)[0].addEventListener('click', function() { $(this).css("pointer-events", "none"); setTimeout(function() { $(".btn").css("pointer-events", "auto")

web开发,关于jsp的常见问题,重复提交,防止后退。

看了网上的,有几种方法:1 在你的表单页里HEAD区加入这段代码: <META HTTP-EQUIV="pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"> <META HTTP-EQUIV="expires" CONTENT="

java防止表单重复提交

目前还没有遇到.感觉是会遇到的,先在这里存一下 1 在你的表单页里HEAD区加入这段代码: <META HTTP-EQUIV="pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"> <META HTTP-EQUIV="expires" C

jsp 防止重复提交

今天在环境上发现一个问题  遂在网上查的 看了网上的,有几种方法: 1 在你的表单页里HEAD区加入这段代码:  <META HTTP-EQUIV="pragma" CONTENT="no-cache">  <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">  <META HTTP-EQUIV="ex

ASP.NET Web Form和MVC中防止F5刷新引起的重复提交问题

转载  http://www.cnblogs.com/hiteddy/archive/2012/03/29/Prevent_Resubmit_When_Refresh_Reload_In_ASP_NET_Web_Form_MVC.html 什么是刷新/重新载入 IE中的刷新(Refresh),在FF和Chrome中称为重新载入(Reload),与正常进入页面的区别在于以下两点: 1. 缓存控制 如果文件(比如图片)在本地缓存中已经存在,正常进入页面会不访问服务器而直接从本地加载.而对于刷新操作,

[原创]java WEB学习笔记34:Session 案例 之 解决表单重复提交

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------