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 相关文章推荐
JQuery上传插件Uploadify使用详解及错误处理
Apr 27 Javascript
JavaScript使用Prototype实现面向对象的方法
Apr 14 Javascript
浅谈javascript事件取消和阻止冒泡
May 26 Javascript
JavaScript判断数组是否包含指定元素的方法
Jul 01 Javascript
详解JavaScript正则表达式之RegExp对象
Dec 13 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
Nov 18 Javascript
vue的token刷新处理的方法
Jul 17 Javascript
Webstorm2016使用技巧(SVN插件使用)
Oct 29 Javascript
VUE写一个简单的表格实例
Aug 06 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
Dec 06 Javascript
vue实现的多页面项目如何优化打包的步骤详解
Jul 19 Javascript
原生js实现点击按钮复制内容到剪切板
Nov 19 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密码生成类实例
2014/09/24 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
在浏览器窗口上添加遮罩层的方法
2012/11/12 Javascript
JS打开新窗口的2种方式
2013/04/18 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
Python读取网页内容的方法
2015/07/30 Python
python监控文件或目录变化
2016/06/07 Python
Python列表list排列组合操作示例
2018/12/18 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
Django框架登录加上验证码校验实现验证功能示例
2019/05/23 Python
python实现最大优先队列
2019/08/29 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
网络工程师的自我评价
2013/10/02 职场文书
函授本科毕业生自我鉴定
2013/10/16 职场文书
会计主管岗位职责
2014/01/03 职场文书
企业给企业的表扬信
2014/01/13 职场文书
个人充满哲理的自我评价
2014/02/20 职场文书
《曹刿论战》教学反思
2014/03/02 职场文书
《路旁的橡树》教学反思
2014/04/07 职场文书
小学生竞选班长演讲稿
2014/04/24 职场文书
思想作风建设心得体会
2014/10/22 职场文书
党员承诺书范文2015
2015/04/27 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
基于Python和openCV实现图像的全景拼接详细步骤
2021/10/05 Python
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫
python pygame 开发五子棋双人对弈
2022/05/02 Python
vscode内网访问服务器的方法
2022/06/28 Servers