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实现判断图片是否加载完成的3种方法整理
Mar 13 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
Apr 02 Javascript
详述JavaScript实现继承的几种方式(推荐)
Mar 22 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
May 12 Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
Jul 07 Javascript
解决Jquery下拉框数据动态获取的问题
Jan 25 jQuery
vue+axios新手实践实现登陆的示例代码
Jun 06 Javascript
element-ui 上传图片后清空图片显示的实例
Sep 04 Javascript
Elasticsearch实现复合查询高亮结果功能
Sep 10 Javascript
JS正则表达式常见函数与用法小结
Apr 13 Javascript
Javascript新手入门之字符串拼接与变量的应用
Dec 03 Javascript
微前端qiankun改造日渐庞大的项目教程
Jun 21 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
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
深入理解PHP中的global
2014/08/19 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
移动端界面的适配
2017/01/11 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
vue自定义指令用法经典实例小结
2019/03/16 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
python中的内置函数getattr()介绍及示例
2014/07/20 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
python2使用bs4爬取腾讯社招过程解析
2019/08/14 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
J2EE中常用的名词进行解释
2015/11/09 面试题
个人近期表现材料
2014/02/11 职场文书
2014年党员学习“三严三实”思想汇报
2014/09/15 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
九不准学习心得体会
2016/01/23 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书
zabbix监控mysql的实例方法
2021/06/02 MySQL
Python+Tkinter制作专属图形化界面
2022/04/01 Python