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常用自定义公共函数汇总
Jan 15 Javascript
js中传递特殊字符(+,&amp;)的方法
Jan 16 Javascript
JS判断、校验MAC地址的2个实例
May 05 Javascript
jquery 取子节点及当前节点属性值
Jul 25 Javascript
利用JS实现数字增长
Jul 28 Javascript
JavaScript登录验证码的实现
Oct 27 Javascript
js原生实现FastClick事件的实例
Nov 20 Javascript
js获取浏览器和屏幕的各种宽度高度
Feb 22 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
Sep 28 Javascript
Taro集成Redux快速上手的方法示例
Jun 21 Javascript
微信小程序自定义组件之可清除的input组件
Jul 17 Javascript
Vue 封装防刷新考试倒计时组件的实现
Jun 05 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
实例讲解yii2.0在php命令行中运行的步骤
2015/12/01 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
浅谈PHP的反射API
2017/02/26 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
cnblogs csdn 代码运行框实现代码
2009/11/02 Javascript
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
微信小程序开发探究
2016/12/27 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
vue中如何让子组件修改父组件数据
2018/06/14 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
用Python中的字典来处理索引统计的方法
2015/05/05 Python
Python引用模块和查找模块路径
2016/03/17 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
python3中bytes和string之间的互相转换
2017/02/09 Python
python正则表达式re之compile函数解析
2017/10/25 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
Python用SSH连接到网络设备
2021/02/18 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
计算机网络毕业生自荐信
2013/10/01 职场文书
省级四好少年事迹材料
2014/01/25 职场文书
分公司负责人任命书
2014/06/04 职场文书
幼儿园辞职书
2015/02/26 职场文书
高中美术教学反思
2016/02/17 职场文书