手机号验证码重新发送

前文叙述

很久以前做的一个 demo ,纯 HTML 、CSS、js 制作,一定时间段之后才可以重新发送验证码,如 60s
后再次发送验证码,在该时间段内发送验证码按钮为禁用状态,实战开发过程也亦是同理,因此记录一手。

一、效果图:

请添加图片描述

二、实现代码:

<!DOCTYPE html>
<html>
<head>
  <title>登录表单</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      background-color: #f2f2f2;
      min-height: 100vh;
      display: flex;
	  justify-content: center;
	  align-items: center;
	  border-
    }

    .container {
      max-width: 400px;
      min-width: 400px;
      margin: auto;
      padding: 20px;
      background-color: #fff;
      border-radius: 5px;
      box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
    }

    h2 {
      text-align: center;
      margin-bottom: 30px;
    }

    .form-group {
      margin-bottom: 20px;
    }

    .form-group-inline {
      display: flex;
      align-items: center;
    }

    label {
      display: block;
      font-weight: bold;
      margin-bottom: 5px;
      flex: 0 0 100px;
    }

    input[type="text"],
    input[type="password"] {
      flex: 1;
      padding: 10px;
      border: 1px solid #ddd;
      border-radius: 4px;
      box-sizing: border-box;
    }
    input[type="text"]:fous{
      border-color: #ebecff;
    }

    .btn {
      display: inline-block;
      padding: 10px 20px;
      background-color: #4caf50;
      color: #fff;
      text-align: center;
      text-decoration: none;
      border-radius: 4px;
      cursor: pointer;
      transition: background-color 0.3s;
    }
    #code {
	  width: 100px;
	  margin-right: 30px;
    }

    .btn:hover {
      background-color: #45a049;
    }

    .btn-disabled {
      background-color: #ccc;
      cursor: not-allowed;
    }
  </style>
</head>
<body>
  <div class="container">
    <h2>登录</h2>
    <div class="form-group form-group-inline">
      <label for="phone">手机号码:</label>
      <input type="text" id="phone" placeholder="请输入手机号码">
    </div>
    <div class="form-group form-group-inline">
      <label for="code">验证码:</label>
      <input type="text" id="code" placeholder="请输入验证码">
	  <button id="sendCode" class="btn">发送验证码</button>
      
     
    </div>
    <button id="loginBtn" class="btn">登录</button>
  </div>

  <script>
    // 获取DOM元素
    const phoneInput = document.getElementById('phone');
    const codeInput = document.getElementById('code');
    const sendCodeBtn = document.getElementById('sendCode');
    const loginBtn = document.getElementById('loginBtn');

    let timer;
    let countdown = 60;
    
    function validatePhoneNumber(phoneNumber) {
	  // 使用正则表达式进行手机号码校验
	  let regex = /^1[0-9]{10}$/;
	  return regex.test(phoneNumber);
	}
	
	function validateVerificationCode(code) {
	  // 使用正则表达式进行六位数验证码校验
	  let regex = /^\d{6}$/;
	  return regex.test(code);
}

    // 发送验证码按钮点击事件
    sendCodeBtn.addEventListener('click', () => {
      if (!phoneInput.value) {
        alert('请输入手机号码');
        return;
      }
      if (!this.validatePhoneNumber(phoneInput.value)) {
        alert("请输入合法手机号");
		return;
      }

      // 禁用发送验证码按钮
      sendCodeBtn.disabled = true;
      sendCodeBtn.classList.add('btn-disabled');

      // 开始倒计时
      countdown = 10;
      sendCodeBtn.innerText = `${countdown}s`;
      sendCodeBtn.style.display = 'block';
      timer = setInterval(() => {
        countdown--;
        if (countdown === 0) {
          // 倒计时结束,恢复发送验证码按钮状态
          clearInterval(timer);
       
          sendCodeBtn.disabled = false;
          sendCodeBtn.classList.remove('btn-disabled');
          sendCodeBtn.innerText = "发送验证码";
          
        } else {
          sendCodeBtn.innerText = `${countdown}s`;
        }
      }, 1000);

      // 模拟发送验证码的逻辑,这里使用了setTimeout
      setTimeout(() => {
        alert('验证码已发送,请注意查收');
      }, 2000);
    });

    // 登录按钮点击事件
    loginBtn.addEventListener('click', () => {
      // 检查手机号和验证码是否为空
      if (!phoneInput.value || !this.validatePhoneNumber(phoneInput.value)) {
        alert('请输入合法手机号');
        return;
      }
	  if (!this.validateVerificationCode(codeInput.value)) {
        alert('请输入合法验证码');
        return;
      }

    });

  </script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/444149.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

供应商评价与选择改进研究——21年数学建模国赛C题分析

题目描述 问题一分析&#xff08;基于APH、PCA和TOPSIS的供应商评价与选择&#xff09; 问题一需要我们对附件一中的402家供应商的数据进行处理并量化分析&#xff0c;并构建数学模型选择当中最重要的50家供应商。 附件一&#xff1a; 部分订货量 部分供货量 注意&#xff…

Android 9.0 Folder文件夹全屏后文件夹图标列表居中时拖拽app到桌面的优化

1.概述 在9.0的系统rom产品开发中,在Launcher3中在目前的产品需求开发中,对于Launcher3中的文件夹Folder的布局UI 进行了定制化的需求要求把Folder修改为全屏,然后在中间显示文件夹图标的列表,这时候如果Folder是全屏的话,如果拖拽文件夹列表中的app图标,只有拖拽 到屏幕…

csp复习题

最短路&#xff1a;最优灌溉&#xff08;201412-4&#xff09; 题目描述 问题描述 雷雷承包了很多片麦田&#xff0c;为了灌溉这些麦田&#xff0c;雷雷在第一个麦田挖了一口很深的水井&#xff0c;所有的麦田都从这口井来引水灌溉。   为了灌溉&#xff0c;雷雷需要建立一些…

【算法与数据结构】栈的实现详解

文章目录 &#x1f4dd;栈的概念及结构&#x1f309;栈的实现 &#x1f320;栈的接口&#x1f309;初始化栈&#x1f320;入栈&#x1f309;出栈&#x1f320;获取栈顶元素&#x1f309;获取栈中有效元素个数&#x1f309;检测栈是否为空&#x1f309;销毁栈&#x1f309;Stack…

别错过AI 大模型的奇妙世界!让你惊艳不已!

AI大模型的应用已经渐渐渗透到我们生活的方方面面&#xff0c;从语音识别到自然语言处理&#xff0c;从图像识别到智能推荐&#xff0c;无处不在的AI大模型正在改变着我们的生活。其背后隐藏的奇妙世界让人惊艳不已。 一方面&#xff0c;AI大模型在语音识别领域展现出了强大的…

C语言学习笔记,学懂C语言,看这篇就够了!(上)

说明&#xff1a;这是本人在学习C语言的时候整理的笔记&#xff0c;因文字限制&#xff0c;所以分为三篇文章&#xff0c;即上中下来分享这份笔记。 看完这三部分&#xff0c;C语言基础、计算机C语言二级(关于C语言的部分)、期末考试。考研数据结构(如考408的话&#xff0c;数…

蓝桥杯倒计时 36天-DFS练习

文章目录 飞机降落仙境诅咒小怂爱水洼串变换 飞机降落 思路&#xff1a;贪心暴搜。 #include<bits/stdc.h>using namespace std; const int N 10; int t,n; //这题 N 比较小&#xff0c;可以用暴力搜搜复杂度是 TN*N! struct plane{int t,d,l; }p[N]; bool vis[N];//用…

【C语言】文件操作篇-----程序文件和数据文件,文件的打开和关闭,二进制文件和文本文件,fopen,fclose【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】文件操作篇-----程序文件和数据文件&#xff0c;文件的打开和关闭&#xff0c;二进制文件和文本文件【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 在了解完动态内存管…

Visual Basic6.0零基础教学(1)—vb的介绍和布局及其小案例

Visual Basic6.0零基础教学(1) 文章目录 Visual Basic6.0零基础教学(1)前言一、vb6.0介绍二、vb的起源一、起源&#xff1a;Basic二、版本三、 Visual Basic6.0 三种版本&#xff1a;四、vb的特点 1.vb的布局介绍创建应用程序的步骤总结 前言 大家好,从今天开始我也会开始更新…

视频可回溯系统技术方案vue3+ts+tegg+mysql+redis+oss

一、 项目背景 保险、基金、银行等众多行业在做技术平台时都会需要一种能够准确了解用户操作行为的方式方法。诸如通过埋点、平台监控、视频可回溯等&#xff0c;通过技术手段&#xff0c;保存用户操作轨迹&#xff0c;以此规范安全销售、平台健康检查、出现纠纷时可追溯、问题…

python的scripts文件夹作用

Windows系统&#xff1a; Scripts文件夹通常位于Python的安装目录下&#xff0c;如C:\Python\Scripts。该文件夹内包含了各种有用的工具&#xff0c;例如pip、virtualenv等&#xff0c;这些工具有助于管理和配置Python环境和依赖包。 Linux系统&#xff1a; 在Linux系统中&…

vivado管理实施、

管理实施 Vivado设计套件包括各种设计流程&#xff0c;并支持一系列设计来源。为了生成可以下载到AMD设备上的比特流&#xff0c;设计必须通过实施。实现是采取逻辑网表并将其映射到物理网表的一系列步骤目标AMD设备的阵列。实施包括&#xff1a; •逻辑优化 •逻辑单元的放…

Django添加app

Django添加App python manage.py startapp [app_name]快速上手 注册app&#xff0c;setting.py 编写url和视图的对应关系 添加视图函数 命令行启动 python manage.py runserver页面模板

Windows下安装pip

一、下载pip 官网地址&#xff1a;https://pypi.org/project/pip/#files 1.1、pip工具查找方法 单击官网首页“PyPi”选项 在弹出来的搜索框中输入“pip” 选择最新的pip版本&#xff0c;点进去 下载pip安装包包 二、安装pip 解压“pip-24.0.tar.gz”&#xff0c;进…

AI绘画提示词案例(宠物

目录 1. 雪地猫猫&#xff1a;1.1 提示词&#xff1a;1.2 效果&#xff1a; 2. 趴地猫猫&#xff1a;2.1 提示词&#xff1a;2.2 效果&#xff1a; 3. 长城萨摩耶&#xff1a;3.1 提示词&#xff1a;3.2 效果&#xff1a; 4. 沙发猫猫&#xff1a;4.1 提示词&#xff1a;4.2 效…

Unity基础学习

目录 基础知识点3D数学——基础Mathf三角函数坐标系 3D数学——向量向量模长和单位向量向量的加减乘除向量点乘向量叉乘向量插值运算 3D数学——四元数为何使用四元数四元数是什么四元数常用方法四元数计算 MonoBehavior中的重要内容延迟函数协同程序协同程序原理 Resources资源…

Linux——权限的理解

Linux——权限的理解 文章目录 Linux——权限的理解一、shell命令以及运行原理二、Linux权限的概念切换用户对指令提权 三、Linux权限管理1. 文件访问者的分类&#xff08;人&#xff09;2. 文件类型和访问权限&#xff08;事物属性&#xff09;文件类型基本权限文件权限值的表…

准备系统运行的先决条件

知识点&#xff1a; 大数据基础环境准备 重 点&#xff1a; SSH免密码连接 安装配置JDK 安装配置Scala 项目开发测试环境为分布式集群环境&#xff0c;在当前项目中使用多台基于CentOS 64bit 的虚拟机来模拟生产环境。在生产环境中建议使用高性能物理主机或云主机搭建集…

el根据需求合并列

将 列分为 3 3 1 的格式 以下是vue代码&#xff1a; <el-table:data"dataSource":border"true":header-cell-style"{ font-weight: normal, text-align: center }":cell-style"{ text-align: center }"size"mini"style…

枚举赋值及强制转换问题

对枚举进行字符赋值&#xff0c;需要进行强制类型转换之后&#xff0c;才能得到想要的值&#xff0c;如下 typedef enum data {DIRECTION_X X,DIRECTION_Y Y,DIRECTION_Z Z,DIRECTION_T T }NumData;int main() {NumData numdata DIRECTION_Y;count <<"num is&…
最新文章