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获取客户端外网ip的简单实例
Nov 21 Javascript
jquery超简单实现手风琴效果的方法
Jun 05 Javascript
javascript日期操作详解(脚本之家整理)
Sep 05 Javascript
在JavaScript中使用JSON数据
Feb 15 Javascript
第一次接触JS require.js模块化工具
Apr 17 Javascript
JS 组件系列之BootstrapTable的treegrid功能
Jun 16 Javascript
Vue.js实例方法之生命周期详解
Jul 03 Javascript
webpack4 css打包压缩问题的解决
May 18 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
Jul 26 Javascript
vue微信分享到朋友圈 vue微信发送给好友
Nov 28 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
Sep 24 Javascript
JavaScript实现图片放大预览效果
Nov 02 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 文件夹删除、php清除缓存程序
2009/08/25 PHP
php开启安全模式后禁用的函数集合
2011/06/26 PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
2012/10/03 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
通过说明与示例了解js五种设计模式
2019/06/17 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python正则表达式抓取成语网站
2013/11/20 Python
利用Python2下载单张图片与爬取网页图片实例代码
2017/12/25 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
python3 爬取图片的实例代码
2018/11/06 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
Python求离散序列导数的示例
2019/07/10 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
Python的两道面试题
2013/06/29 面试题
财务管理专业应届毕业生求职信
2013/09/22 职场文书
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
《十六年前的回忆》教学反思
2014/02/14 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python