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 相关文章推荐
奇妙的js
Sep 24 Javascript
JavaScript插入动态样式实现代码
Feb 22 Javascript
如何学习Javascript入门指导
Nov 01 Javascript
js控制淡入淡出示例代码
Nov 12 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
Feb 13 Javascript
通过扫描二维码打开app的实现代码
Nov 10 Javascript
深入浅析Vue组件开发
Nov 25 Javascript
Bootstrap表格使用方法详解
Feb 17 Javascript
AngularJS表单验证功能分析
May 26 Javascript
详解如何制作并发布一个vue的组件的npm包
Nov 10 Javascript
微信小程序云开发修改云数据库中的数据方法
May 18 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
Jan 04 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
laravel框架 laravel-admin上传图片到oss的方法
2019/10/13 PHP
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
Bootstrap表格使用方法详解
2017/02/17 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
JS实现按钮颜色切换效果
2020/09/05 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
react实现换肤功能的示例代码
2018/08/14 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
python使用paramiko模块实现ssh远程登陆上传文件并执行
2014/01/27 Python
Python代码调试的几种方法总结
2015/04/15 Python
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
Python 中由 yield 实现异步操作
2020/05/04 Python
美国环保婴儿用品公司:The Honest Company
2017/11/23 全球购物
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
带刀到教室的检讨书
2014/10/04 职场文书
病危通知单
2015/04/17 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
青年联谊会致辞
2015/07/31 职场文书
检讨书范文
2019/04/16 职场文书
分享7个 Python 实战项目练习
2022/03/03 Python