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 相关文章推荐
20款效果非常棒的 jQuery 插件小结分享
Nov 18 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
Mar 15 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
Jun 27 Javascript
多种方法实现load加载完成后把图片一次性显示出来
Feb 19 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
Sep 19 Javascript
vue双向数据绑定原理探究(附demo)
Jan 17 Javascript
js字符串与Unicode编码互相转换
May 17 Javascript
深入浅析Node.js单线程模型
Jul 10 Javascript
微信小程序调用摄像头隐藏式拍照功能
Aug 22 Javascript
Node.js net模块功能及事件监听用法分析
Jan 05 Javascript
jQuery内容选择器与表单选择器实例分析
Jun 28 jQuery
vue实现pdf文档在线预览功能
Nov 26 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 strtotime函数详解
2009/12/18 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
Javascript的匿名函数小结
2009/12/31 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
2019/12/06 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
python自定义解析简单xml格式文件的方法
2015/05/11 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
Python+微信接口实现运维报警
2016/08/27 Python
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
python 自动重连wifi windows的方法
2018/12/18 Python
详解python中index()、find()方法
2019/08/29 Python
python sorted函数原理解析及练习
2020/02/10 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
喷漆工的岗位职责
2014/03/17 职场文书
动员大会主持词
2014/03/20 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
婚前协议书范本两则
2014/10/16 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
认识实习感想
2015/08/10 职场文书
导游词之大雁塔景区
2019/09/17 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
AJAX实现省市县三级联动效果
2021/10/16 Javascript