JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)


Posted in Javascript onJuly 07, 2017

应用场景

在开发“发送短信验证”功能时候,要解决一个问题,防止恶意或频繁发送短信验证码问题。一般原理是“当点击发送按钮时,发送ajax请求到服务器发送短信验证码,成功则把发送按钮设置为不可点击,并且调用定时器,按钮显示倒计时”。如果就这样不对倒计时存储做处理,那么当刷新页面,会出现倒计时失效,按钮可点击。提供以下解决方案:

  • 利用cookie存储倒计时
  • 利用HTML5的localStorage 存储倒计时

利用cookie存储倒计时

发送成功后把剩余倒计时存储到cookie,当页面刷新时,检查cookie 是否还存储着剩余倒计时?,如果有,发送按钮则保持倒计时状态,不可点击,否则发送按钮可点击。

HTML代码

<input type="button" id="btn" disabled="disabled" value="获取验证码">

jQuery代码

<!--引入jquery.cookie.js 插件-->
<script src="http:jquery.cookie.js" type="text/javascript" charset="utf-8"></script>
<!--逻辑功能代码 -->
<script>
  $(function(){
   if($.cookie("total")!=undefined&&$.cookie("total")!='NaN'&&$.cookie("total")!='null'){//cookie存在倒计时
     timekeeping();
   }else{//cookie 没有倒计时
     $('#btn').attr("disabled", false);
   }
   function timekeeping(){
    //把按钮设置为不可以点击
    $('#btn').attr("disabled", true);
    var interval=setInterval(function(){//每秒读取一次cookie
     //从cookie 中读取剩余倒计时
     total=$.cookie("total");
     //在发送按钮显示剩余倒计时
     $('#btn').val('请等待'+total+'秒');
     //把剩余总倒计时减掉1
     total--;
     if(total==0){//剩余倒计时为零,则显示 重新发送,可点击
     //清除定时器
     clearInterval(interval);
     //删除cookie
     total=$.cookie("total",total, { expires: -1 });
     //显示重新发送
     $('#btn').val('重新发送');
     //把发送按钮设置为可点击
     $('#btn').attr("disabled", false);
     }else{//剩余倒计时不为零
     //重新写入总倒计时
     $.cookie("total",total);
     }
    },1000);
   }
   //绑定发送按钮
    $('#btn').click(function(event) {
   /* Act on the event */
   // alert($("#btn").val());
   //校验手机号码
   var phone=$('#phone').val();
   var pre=/^[1][358][0-9]{9}$/;
   if(phone==''){
     layer.open({
       content: '手机号码不能为空',
       time: 2
     });
     return this;
   }else{
     var pre=/^[1][358][0-9]{9}$/;
     if(!pre.test(phone)){
      layer.open({
        content: '手机号码格式有误!',
        time: 2
      });
       return this;
     }
   }
   $.ajax({
    url: '',//服务器发送短信
    type: 'GET',
    dataType: 'json',
    data: {phone: phone},
   })
   .done(function(re) {
      var str="发送短信验证码成功,请注意查看您的手机";
      // console.log(re);
      if(re){
        $.cookie("total",60);
        timekeeping();
      }else{
        switch (re[0]) {
         case '160038':
          str="短信验证码发送过频繁";
          break; 
         case '160034':
          str="号码黑名单";
          break; 
         case '160000':
          str="系统错误";
          break;
         case '000000':
          str="发送成功";
          break;
         case '112300':
          str="接收短信的手机号码为空";
          break; 
         case '160040':
          str="验证码超出发送上限";
          break;
         case '160042':
          str="号码格式有误";
          break; 
         default:
          str="发送验证码失败";
          break;
        }
      }
      layer.open({
         content: str,
         time: 2
       });
   })
   .fail(function() {
    console.log("error");
   })
   .always(function() {
    console.log("complete");
   });
  });
  })
</script>

以上所述是小编给大家介绍的JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 无符号右移运算符
Apr 17 Javascript
jValidate 基于jQuery的表单验证插件
Dec 12 Javascript
AngularJS实现表单手动验证和表单自动验证
Dec 09 Javascript
jQuery前端开发35个小技巧
May 24 Javascript
JS实现自动阅读单词(有道单词本添加功能)
Nov 14 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
Apr 10 Javascript
详解JavaScript中的强制类型转换
Apr 15 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
Aug 12 Javascript
layui 上传文件_批量导入数据UI的方法
Sep 23 Javascript
vue 根据选择条件显示指定参数的例子
Nov 09 Javascript
node.js事件轮询机制原理知识点
Dec 22 Javascript
微信小程序实现下滑到底部自动翻页功能
Mar 07 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
Jul 07 #Javascript
JS实现搜索关键词的智能提示功能
Jul 07 #Javascript
vue.js国际化 vue-i18n插件的使用详解
Jul 07 #Javascript
javascript ES6 新增了let命令使用介绍
Jul 07 #Javascript
微信小程序之绑定点击事件实例详解
Jul 07 #Javascript
分享19个JavaScript 有用的简写写法
Jul 07 #Javascript
Vue.js数据绑定之data属性
Jul 07 #Javascript
You might like
php精度计算的问题解析
2019/06/21 PHP
php redis setnx分布式锁简单原理解析
2020/10/23 PHP
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
javascript模块化简单解析
2016/04/07 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
2017/05/03 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
Python编写Windows Service服务程序
2018/01/04 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
伦敦鲜花递送:Flower Station
2021/02/03 全球购物
党员2014两会学习心得体会
2014/03/17 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
教育合作协议范本
2014/10/17 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
医院病假条范文
2015/08/17 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript