使用HTML、CSS和Javascript编写一个注册界面(二)

倘若代码中有任何问题或疑惑,欢迎提出交流哦~


在上一篇文章我们实现了页面的建设,接下来我们实现JavaScript交互逻辑。
交互功能

  1. 密码显示
  2. 当用户输入的内容不符合规范时报错
  3. 在提交注册界面是若有报错则提交失败

密码显示

要实现密码显示的逻辑为:

  1. 获取密码input对象
  2. 通过按钮点击事件来进行交互
  3. inputpassword类型则转化为text类型,因为text会直接显示文本,而password类型不会,再对应切换图片的地址。

效果如下:
在这里插入图片描述

在这里插入图片描述
代码如下:

var password = document.getElementById('password');
    var btn = document.getElementById('button');
    var img = document.getElementById('img');
    btn.onclick = function() {
        if(password.type == "password") {
            password.type = "text";
            img.src = "./image/hide.png";
        }else {
            password.type = "password";
            img.src = "./image/view.png";
        }
    }

需要注意的是,因为button元素的默认类型是submit,当点击按钮时,会触发功能三、表单的提交事件,所以需要再里面加上类型type="button"

验证内容

实现效果:在输入内容改变时就响应验证是否符合规范,若不符合则将对应提示信息转为红色,且在输入框左边出现红色感叹号。

那么我们在对应的html代码中就需要加入一个感叹号了,如下

<li>      
	<input type="text" id="name" placeholder="请输入用户昵称">
    <span id="wrong" class="wrong">!</span>
    <p class="prompt">用户名只能包含英文字符、中文字符、数字,长度在2-15。</p>
</li>

那么在密码输入框又需要调整一下了,毕竟密码输入框右边有一个显示按钮。

这里给出昵称验证逻辑代码,为了文章篇幅,后面会给出总的代码,大体思路一样,在我之前的文章编写一个问卷界面 并用JavaScript来验证表单内容。里面有更详细地讲述了这里的验证过程。

	// 验证输入部分,提示信息, 报错感叹号
	var ipt = document.getElementsByTagName('input');
    var p = document.getElementsByTagName('p');
    var wrong = document.getElementsByClassName('wrong')
    let bool = new Array(5).fill(true);
    // 0 昵称验证逻辑
    ipt[0].oninput = function() {
        var name = ipt[0].value;
        var request = /^[\u4e00-\u9fa5_a-zA-Z0-9]{2,15}$/
        if(!request.test(name)) {
            p[0].style.color = "red";
            wrong[0].style.display = "inline"
            bool[0] = false;
        }else {
            p[0].style.color = "rgba(0, 0, 0, 0.3)";
            wrong[0].style.display = "none"
            bool[0] = true;x
        }
    }

前瞻断言

五个输入验证当中,除了密码验证都与账号验证大差不差,而在密码验证里,因为我们要实现的效果是,同时包含大小写字母、数字和符号,同时包含的效果,需要使用正则表达式的"positive lookahead",又被称为前瞻断言,这里介绍用法:
“positive lookahead” 语法是:(?=...) 其中"…"是你想要寻找的模式。

正则表达式的 “positive lookahead” 是一种前瞻断言,它以特定的方式匹配字符串。具体来说,它会查找字符串中是否存在满足特定模式的部分,但它并不真的包含(消费)这个部分。
前瞻断言有以下两个特性:
它们是不消费(捕获)的,这意味着,正则表达式的进度在完成检查之后不会前进。换言之,它们只是检查可能性,而不消耗字符。
它们可以包含任何正则表达式元素,包括其他的前瞻断言。
请注意,JavaScript 的正则表达式也支持否定前瞻 (?!..),它的功能是与肯定前瞻相反:它会查找后续不匹配特定模式的部分。

密码相应的正则表达式如下所示:

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{6,20}$/

这个表达式的含义如下:

  • (?=.*[a-z]) 确保至少有一个小写字母
  • (?=.*[A-Z]) 确保至少有一个大写字母
  • (?=.*\d) 确保至少有一个数字
  • (?=.*[^\da-zA-Z]) 确保至少有一个特殊字符
  • {6,20} 确保字符长度在6-20之间

在正则表达式中,点号 . 表示匹配任何单个字符(除了换行符),星号 * 用于指定前面的元素可以出现零次或多次。
因此, .* 的组合在正则表达式中意味着“匹配任何数量的任何字符”。
在前瞻断言中使用 .* 就会变得非常有用。当你写 (?=.*[a-z]) 时,你的意思是:“向前看,我希望在之后的某个地方看到一个小写字母。这个小写字母前可以有任何数量的任何字符。”

实现如下效果:
在这里插入图片描述

提交验证逻辑

思路为:遍历bool数组,如果有一个未通过,则提出警告框,显示提示信息,并且阻止表单提交。
效果如下:
在这里插入图片描述

代码如下:

	document.getElementsByTagName('form')[0].onsubmit = function() {
        for(let i = 0; i < bool.length; i++) {
            if(!bool[i]) {
                alert(p[i].innerText);
                return false;
            }
        }
        return true;
	}

总代码请添加图片描述

下面给出总代码以及图片:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>结合JavaScript编写注册界面</title>
    <style>
        .main {
            /* 设置内容宽度以及水平居中 */
            width: 80%;
            margin: 0 auto;
            margin-left: 20px;
            /* 边框以及边框圆角 */
            border: 1px solid #ccc;
            border-radius: 5px;
            /* 背景颜色 */
            background-color: #f5f5f5;
            padding: 20px;
        }

        form ul li {
            list-style: none;
            margin-bottom: 10px;
        }

        form ul li input[type="text"],
        form ul li input[type="password"],
        form ul li input[type="email"] {
            width: 80%;
            margin-top: 5px;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 4px;
        }

        /* 提示信息部分 */
        .prompt {
            /* 让文本和输入框更紧凑 */
            margin-top: 2px;
            width: 80%;

            /* 设置提示信息为合适的大小,以及颜色 */
            font-size: 12px;
            color: rgba(0, 0, 0, 0.3);
        }
        .wrong {
            color: red;
            display: none;
            font-weight: bold;
        }
        .pass-right {
            display: inline;
        }

        /* 注册按钮部分 */
        form ul li input[type="submit"] {
            float: right;
            margin-top: 10px;
            padding: 10px 20px;
            border: none;
            background-color: #4CAF50;
            color: white;
            cursor: pointer;
        }

        form ul li input[type="submit"]:hover {
            background-color: #45a049;
        }

        /* 显示图标部分 */
        form ul li input[type="password"],
        button {
            display: inline;
        }

        button {
            border: none;
            cursor: pointer;
            padding-top: 5px;
            height: 25px;
            width: 30px;
        }


        img {
            /* 让图片占满整个区域 */
            width: 100%;
            height: 100%;
        }
    </style>
</head>

<body>
    <div class="main">
        <h3>注册界面</h3>
        <form action="#">
            <ul>
                <li>
                    
                    <input type="text" id="name" placeholder="请输入用户昵称">
                    <span id="wrong" class="wrong">!</span>
                    <p class="prompt">用户名只能包含英文字符、中文字符、数字,长度在2-15。</p>
                </li>
                <li>
                    <input type="text" id="account" placeholder="请输入账号">
                    <span id="wrong" class="wrong">!</span>
                    <p class="prompt">账号只能包含字母和数字,长度在6-20,不允许包含任何的特殊符号。</p>
                </li>
                <li>
                    <input type="password" id="password" placeholder="请输入密码">
                    <div class="pass-right">
                        <span id="wrong" class="wrong">!</span>
                        <button id="button" type="button"><img src="./image/view.png" alt="显示" id="img"></button>
                    </div>
                    <p class="prompt">密码长度在6-20个字符,且必须同时包含大写字母,小写字母,数字和特殊字符</p>
                </li>
                <li><input type="text" id="phone" placeholder="请输入你的手机号码">
                    <span id="wrong" class="wrong">!</span>
                    <p class="prompt">手机号为长度11位的中国号码。</p>
                </li>
                <li>
                    <input type="email" id="email" placeholder="请输入邮箱地址">
                    <span id="wrong" class="wrong">!</span>
                    <p class="prompt">请输入符合电子邮件的常规格式。</p>
                </li>
                <li>
                    <input type="submit" id="submit" value="注册">
                    <!-- 消除浮动类,避免上浮 -->
                    <div style="clear: both"></div>
                </li>
            </ul>

        </form>
    </div>
</body>
<script>
    // 交互功能:1. 密码显示 2. 当用户输入的内容不符合规范时报错 3. 在提交注册界面是若有报错则提交失败 
    // 密码显示部分
    var password = document.getElementById('password');
    var btn = document.getElementById('button');
    var img = document.getElementById('img');
    btn.onclick = function() {
        if(password.type == "password") {
            password.type = "text";
            img.src = "./image/hide.png";
        }else {
            password.type = "password";
            img.src = "./image/view.png";
        }
    }

    // 验证输入部分,提示信息, 报错感叹号
    var ipt = document.getElementsByTagName('input');
    var p = document.getElementsByTagName('p');
    var wrong = document.getElementsByClassName('wrong')
    let bool = new Array(5).fill(false);
    // 0 昵称验证逻辑
    ipt[0].oninput = function() {
        var name = ipt[0].value;
        var request = /^[\u4e00-\u9fa5_a-zA-Z0-9]{2,15}$/
        if(!request.test(name)) {
            p[0].style.color = "red";
            wrong[0].style.display = "inline"
            bool[0] = false;
        }else {
            p[0].style.color = "rgba(0, 0, 0, 0.3)";
            wrong[0].style.display = "none"
            bool[0] = true;
        }
    }
    // 1 账号验证逻辑
    ipt[1].oninput = function() {
        var account = ipt[1].value;
        var request = /^[a-zA-Z0-9]{6,20}$/
        if(!request.test(account)){
            p[1].style.color = "red";
            wrong[1].style.display = "inline"
            bool[1] = false;
        }else {
            p[1].style.color = "rgba(0, 0, 0, 0.3)";
            wrong[1].style.display = "none"
            bool[1] = true;
        }
    }
    // 2 密码验证逻辑
    ipt[2].oninput = function() {
        var password = ipt[2].value;
        var request = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{6,20}$/
        if(!request.test(password)){
            p[2].style.color = "red";
            wrong[2].style.display = "inline"
            bool[2] = false;
        }else {
            p[2].style.color = "rgba(0, 0, 0, 0.3)";
            wrong[2].style.display = "none"
            bool[2] = true;
        }
    }
    // 3 手机号验证逻辑
    ipt[3].oninput = function() {
        var phone = ipt[3].value;
        var request = /^1[3-9][0-9]{9}$/;
        if(!request.test(phone)){
            p[3].style.color = "red";
            wrong[3].style.display = "inline"
            bool[3] = false;
        }else {
            p[3].style.color = "rgba(0, 0, 0, 0.3)";
            wrong[3].style.display = "none"
            bool[3] = true;
        }
    }
    // 4 邮箱验证逻辑
    ipt[4].oninput = function() {
        var email = ipt[4].value;
        // 一个常见的电邮验证正则表达式
        var request = /^[\w.-]+@[a-zA-Z\d.-]+\.[a-zA-Z\d.-]+$/;
        if(!request.test(email)) {
            p[4].style.color = "red";
            wrong[4].style.display = "inline";
            bool[4] = false;
        }else {
            p[4].style.color = "rgba(0, 0, 0, 0.3)";
            wrong[4].style.display = "none";
            bool[4] = true;
        }
    };

    // 提交验证功能
    document.getElementsByTagName('form')[0].onsubmit = function() {
        for(let i = 0; i < bool.length; i++) {
            if(!bool[i]) {
                alert(p[i].innerText);
                return false;
            }
        }
        return true;
    }
</script>
</html>

请添加图片描述
请添加图片描述

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

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

相关文章

【kubernetes】k8s集群中的ingress(对外服务)规则详解

目录 一、Ingress 简介 1.1service的作用 1.2外部访问方案 (四种&#xff09;&#x1f339;&#x1f339;&#x1f339; 部署externalIPs 1.3Ingress 是什么 二、Ingress 组成&#x1f339;&#x1f339;&#x1f339; 三、Ingress 工作原理&#x1f431;&#x1f…

TSR,FSR,DLSS超级分辨率的原理分析

先了解一些时域抗锯齿的方法&#xff1a; TAA&#xff1a; 抖动 TAA 的主要原理是跨帧计算多个子像素样本&#xff0c;然后将它们组合成一个最终像素。最简单的方案是在像素内生成随机样本&#xff0c;但有更好的方法来生成固定序列的样本。选择一个好的序列以避免聚集非常重…

LeetCode-数学基础开篇

概念 1.实数 2.指数函数 f(x) &#xff08;a&#xff1e;0且a≠1&#xff09;【a: 底数&#xff08;常量&#xff09;&#xff0c;x: 指数&#xff08;变量&#xff09;】 特征&#xff1a;指数函数在x轴没有交点&#xff0c;是光滑的曲线 3.幂函数 f(x) 【x&#xff…

Nginx的https功能

一.HTTPS功能简介 Web网站的登录页面都是使用https加密传输的&#xff0c;加密数据以保障数据的安全&#xff0c;HTTPS能够加密信息&#xff0c;以免敏感信息被第三方获取&#xff0c;所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议&#xff0c;HTTPS其实…

Python——range() 函数用法详解

Python——range() 用法详解 range() 是一个用于生成整数序列的内置函数&#xff0c;在Python中常用于循环迭代等场景。 它可以接受一个或多个参数&#xff0c;生成一个按指定规则的整数序列。 1.range() 函数的语法 range(stop) range(start, stop,[step])start&#xff1…

1. lvs负载均衡

lvs负载均衡 一、集群技术概述1、集群技术类型2、负载均衡技术3、高可用技术 二、负载均衡 LVS1、LVS介绍2、负载均衡策略/算法3、LVS设计模式3.1 NAT模式的注意事项3.2 DR 直接路由模式的注意事项 三、LVS nat模式的实现1、确认后端服务器网关正确2、安装ipvsadm软件3、开启路…

Java 实验8 集合类

&#xff08;一&#xff09;实验目的 1、掌握JAVA集合类中的Collection的特点及其应用情形&#xff1b; 3、掌握Collection、熟悉集合的特点及应用。 &#xff08;二&#xff09;实验内容和步骤 1、仿照课堂练习的MyStack示例&#xff0c;使用LinkedList集合类实现一个先进…

Java项目:100 springboot共享汽车管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本共享汽车管理系统有管理员和用户。 管理员功能有个人中心&#xff0c;用户管理&#xff0c;投放地区管理&#xff0c;汽车信息管理&#xff0c;汽车…

xrun简单的仿真环境

xrun xceliun makefile文本 all: clean comp ela sim comp:xrun -64bit -compile test.v accessrwc ela:xrun -64bit -elaborate test.v accessrwc sim:xrun -64bit -R -gui clean:xrun -clean 仿真代码 timescale 1ns/1ns module test (); reg clk; initial beginclk 1b…

xtsk—选择自由

最近和一些自由职业者交流时深刻感受到&#xff0c;系统思考不是为了创造更多的工作&#xff0c;而是为了创造更多的自由。我们工作的最终目的&#xff0c;实际上是为了达到不需要为了生存而工作的自由状态&#xff0c;赚钱只是手段&#xff0c;其本质是为了赢得更多的选择权。…

【机器学习300问】108、什么是多项式回归模型?

一、多项式回归是什么 &#xff08;1&#xff09;举例说明 假设你经营着一家农场&#xff0c;想要根据土地面积来预测作物的产量。如果你只用线性模型&#xff08;即&#xff09;&#xff0c;你可能会发现它并不足以描述实际的产量情况&#xff0c;因为实际产量可能会随着土地…

Huawei 大型 WLAN 组网 AC 间漫游

AC1配置命令 <AC6005>display current-configuration # vlan batch 100 # interface Vlanif100description to_S3_CAPWAPip address 10.0.100.254 255.255.255.0 # interface GigabitEthernet0/0/1port link-type trunkport trunk allow-pass vlan 100# ip route-stati…

【2024】Kafka Streams纤细介绍与具体使用(1)

目录 介绍关键特性应用场景核心概念部署方式kafka streams的处理模式 具体使用1、准备工作2、添加依赖3、代码实现3、测试 介绍 Kafka Streams是构建在Apache Kafka之上的客户端库&#xff0c;用于构建高效、实时的流处理应用。它允许你以高吞吐量和低延迟的方式处理记录流&am…

uniapp小程序多线程 Worker 实战【2024】

需求 最近遇到个小程序异步解码的需求&#xff0c;采用了WebAssembly&#xff0c;涉及大量的计算。由于小程序的双线程模型只有一个线程处理数据&#xff0c;因此智能寻求其它的解决方案。查看小程序的文档&#xff0c;发现小程序还提供一个异步线程的Worker方案&#xff0c;可…

Java | Leetcode Java题解之第134题加油站

题目&#xff1a; 题解&#xff1a; class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int n gas.length;int i 0;while (i < n) {int sumOfGas 0, sumOfCost 0;int cnt 0;while (cnt < n) {int j (i cnt) % n;sumOfGas gas[j];sumOfCos…

如何通过 6 种简单方法将照片从华为转移到 PC?

华为作为全球领先的智能手机供应商之一&#xff0c;最近推出了其自主研发的操作系统——HarmonyOS 2.0&#xff0c;旨在为智能手机、平板电脑和智能手表等设备提供更流畅的用户体验。随着Mate 40/P40等系列手机计划升级到HarmonyOS 2.0&#xff0c;用户可能需要将手机中的文件备…

【云原生】Kubernetes----轻量级的现代HTTP反向代理和负载均衡器之Traefik

目录 引言 一、Traefik基本概念 &#xff08;一&#xff09;什么是Ingress &#xff08;二&#xff09;什么是Traefik &#xff08;三&#xff09;Traefik和Nginx的区别 1.设计目标 2.配置语言 3.容器支持 4.功能特性 二、安装部署Traefik &#xff08;一&#xff0…

[C][数据结构][顺序表]详细讲解+实现

目录 1.线性表2.顺序表 - SeqList3.实现4.顺序表缺点 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构&#xff0…

十.数据链路层——MAC/ARP

IP和数据链路层之间的关系 引言 在IP一节中&#xff0c;我们说IP层路由(数据转发)的过程&#xff0c;就像我们跳一跳游戏一样&#xff0c;从一个节点&#xff0c;转发到另一个节点 它提供了一种将数据从A主机跨网络发到B主机的能力 什么叫做跨网络&#xff1f;&#xff1f;&a…

Windows开启远程桌面

搜索并进入【远程桌面设置】 ​​ 开启远程桌面 ​​​ ipconfig​命令查看ip地址&#xff0c;并使用地址在另一台电脑远程登录此电脑 选择其他账户登录&#xff0c;输入用户和密码 ​​ ​​ 成功登录 ​​