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几个不错的函数 $$()
Oct 09 Javascript
执行iframe中的javascript方法
Oct 07 Javascript
Mootools 1.2教程 正则表达式
Sep 15 Javascript
jquery ajax 登录验证实现代码
Sep 23 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
Dec 28 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
Jun 21 Javascript
JavaScript 参数中的数组展开 [译]
Sep 21 Javascript
jQuery实现平滑滚动的标签分栏切换效果
Aug 28 Javascript
js select实现省市区联动选择
Apr 17 Javascript
vue实现搜索功能
May 28 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
Dec 09 Javascript
基于vue实现探探滑动组件功能
May 29 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下获取客户端ip地址的函数
2010/03/15 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
2011/08/20 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
jquery插件ajaxupload实现文件上传操作
2015/12/09 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
angular.extend方法的具体使用
2017/09/14 Javascript
监控微信小程序中的慢HTTP请求过程详解
2019/07/05 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
python实现图片批量压缩程序
2018/07/23 Python
在python中实现对list求和及求积
2018/11/14 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
Python开发之pip安装及使用方法详解
2020/02/21 Python
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
施工材料员岗位职责
2014/02/12 职场文书
物流专员岗位职责
2014/02/17 职场文书
学校搬迁方案
2014/06/15 职场文书
科学发展观标语
2014/10/08 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
检讨书怎么写
2015/05/07 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
《鲸》教学反思
2016/02/23 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL