JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)

下面是详细讲解“JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)”的完整攻略。

一、需求分析

我们要实现的功能是:在用户点击发送短信验证码按钮后,按钮变为不可点击状态,同时开始显示倒计时,直到倒计时结束后按钮恢复可点击状态。

为了防止用户在倒计时过程中刷新页面导致倒计时失效,我们需要使用浏览器的本地存储(localStorage/sessionStorage)来保存倒计时开始时间,页面刷新后可以根据存储的时间计算出倒计时的剩余时间,从而保证倒计时能够正确恢复。

二、实现步骤

1. HTML部分

<button id="send-code-btn">发送验证码</button>

2. JavaScript部分

1)定义倒计时功能函数

function countdown(seconds) {
  var timer = setInterval(function() {
    var btn = document.getElementById('send-code-btn');
    seconds--;
    if (seconds === 0) {
      clearInterval(timer);
      btn.innerHTML = '发送验证码';
      btn.disabled = false;
      localStorage.removeItem('startTime');
    } else {
      btn.innerHTML = '重新发送(' + seconds + ')';
    }
  }, 1000);
}

这个函数负责处理倒计时功能,传入参数seconds表示倒计时的总秒数。在函数内,使用setInterval函数每隔一秒钟更新一次倒计时的状态,直到倒计时结束。结束后清除计时器,同时将按钮文字设置为‘发送验证码’,按钮状态设置为可点击,从localStorage中删除存储的开始时间。

2)绑定按钮点击事件

var btn = document.getElementById('send-code-btn');
btn.addEventListener('click', function() {
  var now = Date.now();
  var startTime = localStorage.getItem('startTime');
  if (startTime && now - startTime < 60 * 1000) {
    alert('请勿频繁发送验证码');
  } else {
    localStroage.setItem('startTime', now);
    btn.disabled = true;
    countdown(60);
    // 发送短信验证码的代码
  }
});

这段代码负责绑定按钮的点击事件,并判断是否可以发送验证码。如果上一次发送验证码的时间距离当前时间不足60秒,那么弹出提示‘请勿频繁发送验证码’。否则,将当前时间存入localStorage中,按钮状态设置为不可点击,调用countdown函数开始倒计时操作,并执行发送短信验证码的代码。

3)处理页面刷新后的倒计时恢复

var btn = document.getElementById('send-code-btn');
var startTime = localStorage.getItem('startTime');
if (startTime) {
  var now = Date.now();
  var seconds = Math.floor((60 * 1000 - (now - startTime)) / 1000);
  if (seconds > 0) {
    btn.innerHTML = '重新发送(' + seconds + ')';
    btn.disabled = true;
    countdown(seconds);
  } else {
    localStorage.removeItem('startTime');
  }
} else {
  btn.innerHTML = '发送验证码';
}

这段代码负责在页面刷新后判断是否存在倒计时未结束的情况,如果存在,则根据存储的开始时间计算出剩余时间,调用countdown函数开始倒计时操作,并将按钮状态设置为不可点击。如果不存在倒计时未结束的情况,则将按钮状态初始化为可点击状态。

三、示例说明

示例一:只包含倒计时功能

<body>
  <button id="btn">点击发送验证码</button>
  <script>
    function countdown(seconds) {
      var btn = document.getElementById('btn');
      var timer = setInterval(function() {
        seconds--;
        if (seconds === 0) {
          clearInterval(timer);
          btn.innerHTML = '点击发送验证码';
          btn.disabled = false;
        } else {
          btn.innerHTML = '重新发送(' + seconds + ')';
        }
      }, 1000);
      btn.disabled = true;
      btn.innerHTML = '重新发送(' + seconds + ')';
    }

    document.getElementById('btn').addEventListener('click', function() {
      countdown(60);
    });
  </script>
</body>

这是一个只包含倒计时功能的示例,在点击按钮后,按钮状态变为不可点击状态,同时开始倒计时,60秒后恢复为可点击状态。

示例二:完整实现发送验证码功能

<body>
  <button id="btn">点击发送验证码</button>
  <script>
    function countdown(seconds) {
      var btn = document.getElementById('btn');
      var timer = setInterval(function() {
        seconds--;
        if (seconds === 0) {
          clearInterval(timer);
          btn.innerHTML = '点击发送验证码';
          btn.disabled = false;
          localStorage.removeItem('startTime');
        } else {
          btn.innerHTML = '重新发送(' + seconds + ')';
        }
      }, 1000);
      btn.disabled = true;
      btn.innerHTML = '重新发送(' + seconds + ')';
      localStorage.setItem('startTime', Date.now());
    }

    document.getElementById('btn').addEventListener('click', function() {
      var now = Date.now();
      var startTime = localStorage.getItem('startTime');
      if (startTime && now - startTime < 60 * 1000) {
        alert('请勿频繁发送验证码');
      } else {
        countdown(60);
        // 发送验证码的代码
      }
    });

    var startTime = localStorage.getItem('startTime');
    if (startTime) {
      var now = Date.now();
      var seconds = Math.floor((60 * 1000 - (now - startTime)) / 1000);
      if (seconds > 0) {
        var btn = document.getElementById('btn');
        btn.innerHTML = '重新发送(' + seconds + ')';
        btn.disabled = true;
        countdown(seconds);
      } else {
        localStorage.removeItem('startTime');
      }
    }
  </script>
</body>

这个示例实现了发送验证码的完整功能,并加入了防止刷新倒计时失效的机制。在点击按钮后,会判断上一次发送验证码的时间是否超过60秒,如果是则调用倒计时功能函数,并且执行发送验证码的代码。在页面刷新后,会判断是否存在倒计时未结束的情况,如果存在,则恢复倒计时功能,并保证倒计时正确地进行,保证了发送验证码功能的正常进行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效) - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript开发中需要搞懂的字符编码总结

    以下是我对字符编码总结的完整攻略: JavaScript开发中需要搞懂的字符编码总结 什么是字符编码? 字符编码是一种将字符(包括数字、字母、符号等)与二进制数之间相互转换的方式。计算机中,所有的信息都是以二进制的形式存储和传输的。因此,为了在计算机中能够正常存储和传输各种字符,需要通过字符编码将字符转换为二进制数。 JavaScript中的字符串是Unic…

    JavaScript 2023年5月20日
    00
  • 浅谈ECMAScript 中的Array类型

    下面我来详细讲解一下“浅谈 ECMAScript 中的 Array 类型”。 什么是 Array 类型 在 ECMAScript 中,Array 类型是一种特殊的对象,用于表示一组数据的集合。数组中的数据可以是任意类型的,包括数字、字符串、布尔值、对象等等。 数组中的数据是按照顺序保存的,每一个数据都有一个对应的索引值,从0开始递增。我们可以通过索引值来访问…

    JavaScript 2023年5月27日
    00
  • Javascript 面向对象(二)封装代码

    关于“Javascript 面向对象(二)封装代码”的完整攻略,可以分为以下几个方面: 1. 了解面向对象编程原则 在使用 Javascript 进行面向对象编程时,我们需要先了解面向对象编程的原则,也就是四大基本原则,即封装、继承、多态和抽象这四个原则。其中,封装是指将数据和逻辑封装在一个类或对象中,隐藏底层细节,让外部只能通过公共接口来访问和操作内部数据…

    JavaScript 2023年5月18日
    00
  • HTML5 本地存储之如果没有数据库究竟会怎样

    这里是 “HTML5 本地存储之如果没有数据库究竟会怎样” 的攻略。 什么是本地存储 本地存储是Web开发中比较重要的一个概念,它可以在不使用服务器数据库的情况下,让我们的Web应用程序缓存数据。HTML5 中的本地存储提供了两种方式:localStorage 和 sessionStorage。 localStorage 存储的数据是永久性的,而 sessi…

    JavaScript 2023年6月11日
    00
  • 关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案

    下面是关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案的完整攻略。 问题描述 在使用JS Lodop打印插件打印Bootstrap页面时,样式会出现错乱,包括字体大小、行高等样式不一致,导致打印效果不符合预期。 解决方案 经过实践和总结,我们得出以下两种解决方案,供大家参考。 解决方案一:使用样式重置 通过在打印页面中添加以下代码来重…

    JavaScript 2023年6月11日
    00
  • javaScript中with函数用法实例分析

    JavaScript中with函数用法实例分析 with函数是JavaScript中的一个特殊函数,用来简化代码编写。尽管with函数的用法看起来很简单,但是使用不当可能会导致代码混乱,因此在使用with函数时需要谨慎。 本文将从以下方面详细讲解with函数的用法,包括: with函数的用法 with函数的实例分析 with函数的用法 with函数的语法: …

    JavaScript 2023年6月10日
    00
  • Javascript String 字符串操作包

    Javascript String 字符串操作包攻略 在Javascript中,String是一种用来表示文字序列的数据类型。String类型的值是由一对双引号或单引号括起来的一串字符。Javascript提供了一系列的字符串操作方法,可以方便地对字符串进行处理。 创建字符串 可以通过以下方式来创建字符串: let str1 = "hello wo…

    JavaScript 2023年5月28日
    00
  • JS字符串截取出现的bug以及解决方式

    JS字符串截取出现的bug以及解决方式 在JavaScript中,字符串截取是一种常见的操作。然而,当我们没有使用正确的方法时,就可能会出现一些不可预料的问题。下面我将详细讲解JS字符串截取出现的bug以及解决方式。 什么是字符串截取? 字符串截取是指从字符串中提取指定长度的子串。在JavaScript中,我们可以使用字符串的slice(), substr(…

    JavaScript 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部