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 函数集合
Jun 11 Javascript
第一个JavaScript入门基础 document.write输出
Feb 22 Javascript
jQuery中not()方法用法实例
Jan 06 Javascript
jQuery中extend函数详解
Jul 13 Javascript
深入理解JavaScript程序中内存泄漏
Mar 17 Javascript
AngularJS 模型详细介绍及实例代码
Jul 27 Javascript
AngularJS中一般函数参数传递用法分析
Nov 22 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
Mar 29 Javascript
vue项目关闭eslint校验
Mar 21 Javascript
原生js实现抽奖小游戏
Jun 27 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
Mar 05 Javascript
JS实现按比例缩小图片宽高
Aug 24 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
图解上海144收音机
2021/03/02 无线电
PHP微信开发之查询微信精选文章
2016/06/23 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
Use Word to Search for Files
2007/06/15 Javascript
js wmp操作代码小结(音乐连播功能)
2008/11/08 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
script标签属性用type还是language
2015/01/21 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
python装饰器使用方法实例
2013/11/21 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
利用python开发app实战的方法
2019/07/09 Python
tensorflow的计算图总结
2020/01/12 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
机电专业体育教师求职信
2013/09/21 职场文书
教学器材管理制度
2014/01/26 职场文书
门诊手术室工作制度
2014/01/30 职场文书
学校节能减排方案
2014/06/13 职场文书
材料员岗位职责
2015/02/10 职场文书
毕业论文答辩稿范文
2015/06/23 职场文书
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android
Win11怎么修改电源模式?Win11修改电源模式的方法
2022/04/05 数码科技
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL
Python基本的内置数据类型及使用方法
2022/04/13 Python