前端防止重复点击

2,314 阅读1分钟

前端会有这么个需求,由于AJAX提交数据为异步提交,在像用户注册或者支付这样的场景里,在用户点完按钮后,ajax返回结果前,是不允许用户在进行点击的。因此,在这里我总结了几个防止重复提交的方法:

1.css设置pointer-events

<!DOCTYPE html>
<html>
<head>
   <title>重复提交</title>
</head>
<body>
<div onclick="ajaxSubmit(this)">提交</div>
<script src="https://libs.cdnjs.net/jquery/3.5.0/jquery.js"></script>
<script type="text/javascript">
   function ajaxSubmit(obj){
      $(obj).css('pointer-events','none')    //失效
      $.ajax({
            url: 'url',
            type: 'post',
            data:{},
            dataType: 'json',
            complete: function (ret) {
               $(obj).css('pointer-events','auto')    //生效
            }
        })
   }
</script>
</body>
</html>

2.添加变量标志

<!DOCTYPE html>
<html>
<head>
   <title>重复提交</title>
</head>
<body>
<div onclick="ajaxSubmit(this)">提交</div>
<script src="https://libs.cdnjs.net/jquery/3.5.0/jquery.js"></script>
<script type="text/javascript">
   function ajaxSubmit(obj){
      // $(obj).css('pointer-events','none') //失效
      if($(obj).attr("disabled")==='disabled'){
            return false;
      }
      $(obj).attr("disabled", true);

      $.ajax({
            url: 'http://baidu.com',
            type: 'post',
            data:{},
            dataType: 'json',
            complete: function (ret) {
               // $(obj).css('pointer-events','auto') //生效
               $(obj).attr("disabled", false);
            }
        })
   }
</script>
</body>
</html>

3.禁用提交

3.1 非按钮

<!DOCTYPE html>
<html>
<head>
   <title>重复提交</title>
</head>
<body>
<div onclick="ajaxSubmit(this)">提交</div>
<script src="https://libs.cdnjs.net/jquery/3.5.0/jquery.js"></script>
<script type="text/javascript">
   function ajaxSubmit(obj){
      // $(obj).css('pointer-events','none') //失效

      // if($(obj).attr("disabled")==='disabled'){
      //       return false;
      // }
      // $(obj).attr("disabled", true);
    
      $(obj).attr('onclick',''); //先置为空
    
      $.ajax({
            url: 'http://baidu.com',
            type: 'post',
            data:{},
            dataType: 'json',
            complete: function (ret) {
               // $(obj).css('pointer-events','auto') //生效
    
               // $(obj).attr("disabled", false);
               
               $(obj).attr('onclick','ajaxSubmit(this)'); //再还原为原方法
            }
        })
   }
</script>
</body>
</html>

3.2 按钮

<!DOCTYPE html>
<html>
<head>
   <title>重复提交</title>
</head>
<body>
<!-- <div onclick="ajaxSubmit(this)">提交</div> -->
<input type="submit" value="提交" onclick="ajaxSubmit(this)" name="">
<script src="https://libs.cdnjs.net/jquery/3.5.0/jquery.js"></script>
<script type="text/javascript">
   function ajaxSubmit(obj){
      // $(obj).css('pointer-events','none') //失效

      // if($(obj).attr("disabled")==='disabled'){
      //       return false;
      // }
      // $(obj).attr("disabled", true);
    
      // $(obj).attr('onclick','');  //先置为空
    
      $(obj).attr("disabled", true);
    
      $.ajax({
            url: 'http://baidu.com',
            type: 'post',
            data:{},
            dataType: 'json',
            complete: function (ret) {
               // $(obj).css('pointer-events','auto') //生效
    
               // $(obj).attr("disabled", false);
    
               // $(obj).attr('onclick','ajaxSubmit(this)'); //再还原为原方法
    
               $(obj).attr("disabled", false);
    
            }
        })
   }
</script>
</body>
</html>

4.加遮罩

<!DOCTYPE html>
<html>
<head>
   <title>重复提交</title>
   <style type="text/css">
      .zhezhao{
         width: 100%;
         height: 100%;
         background: #000;
         opacity: 0.5;
         position: absolute;
         top: 0;
         left: 0;
         z-index: 1;
         display: none;
      }
   </style>
</head>
<body>
<!-- <div onclick="ajaxSubmit(this)">提交</div> -->
<input type="submit" value="提交" onclick="ajaxSubmit(this)" name="">
<div class="zhezhao">加载中</div>

<script src="https://libs.cdnjs.net/jquery/3.5.0/jquery.js"></script>
<script type="text/javascript">
   function ajaxSubmit(obj){
      // $(obj).css('pointer-events','none') //失效

      // if($(obj).attr("disabled")==='disabled'){
      //       return false;
      // }
      // $(obj).attr("disabled", true);
    
      // $(obj).attr('onclick','');  //先置为空
    
      // $(obj).attr("disabled", true);
    
      $('.zhezhao').show();
    
      $.ajax({
            url: 'http://baidu.com',
            type: 'post',
            data:{},
            dataType: 'json',
            complete: function (ret) {
               // $(obj).css('pointer-events','auto') //生效
    
               // $(obj).attr("disabled", false);
    
               // $(obj).attr('onclick','ajaxSubmit(this)'); //再还原为原方法
    
               // $(obj).attr("disabled", false);
    
               $('.zhezhao').hide();
    
            }
        })
   }
</script>
</body>
</html>

我的博客地址: fetie.cn