密码生成器(HTML+CSS+JavaScript)

  🌏个人博客主页:心.c

前言:前两天写了密码生成器,现在跟大家分享一下,大家如果想使用随便拿,如果哪里有问题还请大佬们给我指出,感谢支持

🔥🔥🔥专题文章:密码生成器

😽感谢大家的点赞👍收藏⭐️评论✍您的一键三连是我更新的动力 💓 

目录

作品展示: 

 功能介绍:

 核心: 

 所用字符显示:

上下按钮点击事件:

单选按钮点击事件:

 更新遍历:

 随机数的生成:

 密码的复制:

代码展示(源代码):

HTML:

CSS:

JavaScript:


作品展示: 

 功能介绍:

 核心: 

numArr是我创建的一个用了储存状态的数组,用来设定按钮绑定,‘1’就是绑定的numberArr,'2'就是绑定的smallArr,‘3’绑定的就是bigArr,‘4’就是绑定的middleArr,初始化为‘1’是因为第一个单选按钮是默认已经被点击的,因为开始给第一个radiobox设置了clicked被点击事件,所以开始把‘1’添加上,如果后面监听radiobox时被点击了,我们只需要通过遍历numArr就可以更改totalArr,显示内容和修改密码了

  let numArr = ['1']
 所用字符显示:

下面是四个数组,分别是数字,大写字母,小写字母,和常用符号,主要是用于将这些字符显示在总的totalArr数组里面,所用字符就是totalArr数组里面的内容所用字符内容可以通过下方的所含字符进行修改

//生成四个数组let numberArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']let smallArr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']let bigArr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']let middleArr = ['~', '!', '@', '#', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+']let totalArr = []
上下按钮点击事件:

下方是我的图标点击改变密码长度事件,密码长度限制在6-20之间,当超出范围时,会有提示,num变量是我的全局变量,用来检测生成密码的长度

 //获得两个小图标的dom元素let top = this.document.querySelector('.icon_top')let bottom = this.document.querySelector('.icon_bottom')//给向上箭头添加事件监听top.addEventListener('click', function () {if (num >= 6 && num <= 19) {num++number.innerHTML = num} else {alert('数字已达上限')}})//给向下箭头添加事件监听bottom.addEventListener('click', function () {if (num >= 7 && num <= 20) {num--number.innerHTML = num} else {alert('数字已达下限')}})
单选按钮点击事件:

点击按钮时会对checkbox进行监听,我的4个小按钮都是有一个class checkbox类名,当点击时获得它的data-id 为几,把id添加到我的numArr数组里面或者从中删除(判断是否删除还是进行添加就判断它是否被点击过),‘1’就是绑定的numberArr,'2'就是绑定的smallArr,‘3’绑定的就是bigArr,‘4’就是绑定的middleArr

举例:(如果点击第二个checkbox,如果判断它没有被点击,那么将它的id=2添加到我的numArr当中,这样后面我可以通过遍历我的numArr来改变我的totalArr)

sort排序是为了显示totalArr内容时一直保持数字在前,然后是小写字母,大学字母,字符,不会因为先点击谁而改变顺序(谁下标小先显示谁)

//获得单选按钮let check = this.document.querySelector('.checkbox')//给父级check添加冒泡事件监听check.addEventListener('click', function (e) {if (e.target.tagName === 'INPUT') {let id = e.target.dataset.idif (e.target.checked) {//添加numArr元素numArr.push(id)numArr = numArr.sort()render()} else {const index = numArr.indexOf(id);if (index !== -1) {//删除numArr元素numArr.splice(index, 1);}render()}text.innerHTML = totalArr.join('');}})
 更新遍历:

通过遍历numArr里面的内容来修改我的totalArr

// 通过numArr更新totalArr数组function render() {totalArr = [];  // 清空 totalArrfor (let i = 0; i < numArr.length; i++) {let id = numArr[i];switch (id) {case '1':totalArr = totalArr.concat(numberArr);break;case '2':totalArr = totalArr.concat(smallArr);break;case '3':totalArr = totalArr.concat(bigArr);break;case '4':totalArr = totalArr.concat(middleArr);break;}}}
 随机数的生成:

将遍历totalArr的数组随机显示num长度的密码,并将其显示到页面当中(如果按钮哪个也不选,就返回-1)

 let btn = document.querySelector('.btn')//给按钮添加事件监听,将内容进行添加btn.addEventListener('click', function () {for (let i = 0; i < 6; i++) {let box_text = document.querySelector(`.content [data-id="${i + 1}"] .text`);box_text.innerHTML = getRandom()}})//根据num和totalArr生成随机数function getRandom() {let result = '';if (!totalArr) {for (let i = 0; i < num; i++) {// 生成一个介于 0 和 totalArr.length-1 之间的随机索引let index = Math.floor(Math.random() * totalArr.length);result += totalArr[index];}return result} else {return -1}}
 密码的复制:

因为div里面的字体不能复制,所以我就添加了一个复制功能,下面是实现复制的代码

// 选择所有.copyconst copyButtons = this.document.querySelectorAll('.copy');//添加点击事件监听器copyButtons.forEach(function (copy) {copy.addEventListener('click', function () {// 获取对应的 .text 元素let textElement = copy.previousElementSibling;// 创建一个隐藏的可编辑区域const textarea = document.createElement('textarea');textarea.value = textElement.textContent.trim();textarea.style.position = 'absolute';textarea.style.left = '-9999px';document.body.appendChild(textarea);// 选择文本textarea.select();// 执行复制命令try {if (textarea.value === '') {alert('内容为空不可复制')} else {document.execCommand('copy');alert("内容已复制到剪贴板!");}} catch (err) {console.error('无法复制文本: ', err);}// 清理document.body.removeChild(textarea);});});

代码展示(源代码):

HTML:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="./password.css"><link rel="stylesheet" href="./iconfont/iconfont.css">
</head><body><div class="entire wrapper"><!-- 标题 --><div class="title"><h2>随机密码生成器</h2></div><!-- 密码长度显示框 --><div class="password_length"><span><strong>密码长度:</strong></span><div class="text"></div><div class="icon"><i class="iconfont icon_top">&#xe685;</i><i class="iconfont icon_bottom">&#xe686;</i></div></div><!-- 所用字母显示 --><div class="word_show"><span><strong>所用字符:</strong></span><div class="text"></div></div><!-- 所含字符 --><div class="word_select"><span class="char"><strong>所含字符:</strong></span><div class="checkbox"><div class="number"><input type="checkbox" checked name="number" data-id="1"><span>数字0-9</span></div><div class="small"><input type="checkbox" name="small" data-id="2"><span>小写字母a-z</span></div><div class="big"><input type="checkbox" name="big" data-id="3"><span>大写字母A-Z</span></div><div class="middle"><input type="checkbox" name="middle" data-id="4"><span>常用符号~!@#$%^&*()_+</span></div></div></div><!-- 生成密码 --><button class="btn"><strong>生成密码</strong></button><hr><!-- 生成结果 --><div class="result"><span><strong>生成结果</strong></span><div class="content"><div data-id="1" class="box"><div class="text"></div><div class="copy">复制</div></div><div data-id="2" class="box"><div class="text"></div><div class="copy">复制</div></div><div data-id="3" class="box"><div class="text"></div><div class="copy">复制</div></div><div data-id="4" class="box"><div class="text"></div><div class="copy">复制</div></div><div data-id="5" class="box"><div class="text"></div><div class="copy">复制</div></div><div data-id="6" class="box"><div class="text"></div><div class="copy">复制</div></div></div></div></div><script src="./password.js"></script>
</body></html>
CSS:
* {margin: 0;padding: 0;box-sizing: border-box;
}body {user-select: none;
}a {text-decoration: none;
}li {list-style: none;
}.wrapper {margin: auto;
}.entire {margin-top: 30px;height: 580px;width: 1000px;background-color: #f2fffc;padding: 30px;border-radius: 30px;border: 1px solid rgb(38, 118, 68);
}.title {width: 200px;height: 40px;margin-bottom: 20px;
}.title h2 {color: #78a878;
}.password_length {display: flex;align-items: center;height: 30px;width: 400px;margin-bottom: 20px;}.password_length span {/* padding-top: 10px; */width: 80px;
}.password_length .text {font-size: 14px;padding: 4px;height: 25px;width: 300px;border: 1px solid rgb(156, 156, 156);background-color: #ffffff;
}.password_length .icon {text-align: center;vertical-align: middle;width: 20px;height: 25.25px;border: #afafaf 1px solid;border-left: none;
}.icon i {display: block;color: #757575;font-size: 8px;
}.icon .icon_top,
.icon .icon_bottom {width: 20px;height: 11.8px;
}.icon .icon_top:hover,
.icon .icon_bottom:hover {background-color: #67938d;color: #ffffff;
}.icon .icon_top {border-bottom: 1px solid rgb(135, 135, 135);
}.word_show {display: flex;align-items: center;height: 30px;width: 800px;margin-bottom: 20px;/* background-color: #b0a0a0; */
}.word_show span {/* padding-top: 10px; */width: 80px;
}.word_show .text {padding: 3px;align-items: center;font-size: 13px;width: 720px;height: 25px;background-color: #fff;border: 1px solid rgb(158, 158, 158);
}.word_select {display: flex;align-items: center;height: 30px;width: 800px;margin-bottom: 20px;/* background-color: #bbbbbb; */
}.word_select .char {/* padding-top: 10px; */width: 80px;
}.word_select .checkbox {line-height: 30px;font-size: 13px;color: #797979;display: flex;width: 720px;justify-content: space-between;}.checkbox input {width: 16px;height: 16px;margin-right: 3px;margin-top: 9px;}.checkbox span {display: block;margin-top: 2px;
}.checkbox .number,
.checkbox .small,
.checkbox .big,
.checkbox .middle {display: flex;height: 30px;
}.btn {width: 100px;height: 30px;background-color: #579081;border: none;border-radius: 2px;color: #ffffff;margin-bottom: 20px;
}.result {width: 940px;height: 260px;/* background-color: #e0e0e0; */margin-bottom: 20px;
}hr {margin-bottom: 25px;
}.result .content {margin-top: 20px;display: flex;flex-wrap: wrap;justify-content: space-between;
}.content .box {margin-bottom: 25px;display: flex;border: 1px solid rgb(136, 136, 136);background-color: #f2fffc;width: 300px;height: 45px;align-items: center;
}.content .box .text {font-size: 16px;color: #636363;width: 250px;padding: 12px;
}.content .box .copy {width: 50px;text-align: center;border-left: 1px solid rgb(98, 98, 98);cursor: pointer;}
JavaScript:
window.addEventListener('load', function () {//生成四个数组let numberArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']let smallArr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']let bigArr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']let middleArr = ['~', '!', '@', '#', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+']//checked默认let numArr = ['1']//初始化num为6let num = 6;let number = this.document.querySelector('.password_length .text')number.innerHTML = num//将numberArr初始化到totalArr进行显示let totalArr = []totalArr = totalArr.concat(numberArr)let text = this.document.querySelector('.word_show .text')text.innerHTML = totalArr.join('');//获得两个小图标的dom元素let top = this.document.querySelector('.icon_top')let bottom = this.document.querySelector('.icon_bottom')//给向上箭头添加事件监听top.addEventListener('click', function () {if (num >= 6 && num <= 19) {num++number.innerHTML = num} else {alert('数字已达上限')}})//给向下箭头添加事件监听bottom.addEventListener('click', function () {if (num >= 7 && num <= 20) {num--number.innerHTML = num} else {alert('数字已达下限')}})//获得单选按钮let check = this.document.querySelector('.checkbox')//给父级check添加冒泡事件监听check.addEventListener('click', function (e) {if (e.target.tagName === 'INPUT') {let id = e.target.dataset.idif (e.target.checked) {//添加numArr元素numArr.push(id)numArr = numArr.sort()render()} else {const index = numArr.indexOf(id);if (index !== -1) {//删除numArr元素numArr.splice(index, 1);}render()}text.innerHTML = totalArr.join('');}})// 通过numArr更新totalArr数组function render() {totalArr = [];  // 清空 totalArrfor (let i = 0; i < numArr.length; i++) {let id = numArr[i];switch (id) {case '1':totalArr = totalArr.concat(numberArr);break;case '2':totalArr = totalArr.concat(smallArr);break;case '3':totalArr = totalArr.concat(bigArr);break;case '4':totalArr = totalArr.concat(middleArr);break;}}}let btn = document.querySelector('.btn')//给按钮添加事件监听,将内容进行添加btn.addEventListener('click', function () {for (let i = 0; i < 6; i++) {let box_text = document.querySelector(`.content [data-id="${i + 1}"] .text`);box_text.innerHTML = getRandom()}})//根据num和totalArr生成随机数function getRandom() {let result = '';if (!totalArr) {for (let i = 0; i < num; i++) {// 生成一个介于 0 和 totalArr.length-1 之间的随机索引let index = Math.floor(Math.random() * totalArr.length);result += totalArr[index];}return result} else {return -1}}// 选择所有.copyconst copyButtons = this.document.querySelectorAll('.copy');//添加点击事件监听器copyButtons.forEach(function (copy) {copy.addEventListener('click', function () {// 获取对应的 .text 元素let textElement = copy.previousElementSibling;// 创建一个隐藏的可编辑区域const textarea = document.createElement('textarea');textarea.value = textElement.textContent.trim();textarea.style.position = 'absolute';textarea.style.left = '-9999px';document.body.appendChild(textarea);// 选择文本textarea.select();// 执行复制命令try {if (textarea.value === '') {alert('内容为空不可复制')} else {document.execCommand('copy');alert("内容已复制到剪贴板!");}} catch (err) {console.error('无法复制文本: ', err);}// 清理document.body.removeChild(textarea);});});})

 到这里就分享完成了,感谢大家的观看 ! ! !

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 的半同步模式

目录 1 半同步简介: 解决主从数据一致性问题 2 实现半同步模式实践操作 2.1 MASTER 2.2 SLAVE 1 2.3 SLAVE 2 2.4 查看client链接状态 2.5 SLAVE 服务器故障模拟 2.5.1 停止 SLAVE 的 IO_THREAD 2.5.2 查看SLAVE 的IO线程是否关闭 2.5.3 查看 MASTER 上 client 的连接状态…

在树莓派5上使用pytroch进行模型训练—全流程笔记

在树莓派上运行pytroch模型&#x1f680; 在完成了树莓派的一系列基础配置学习之后&#xff0c;按照规划&#xff0c;下一步要做的就是在树莓派上安装一个pytorch&#xff0c;尝试运行一下深度学习的模型&#xff0c;如果可以实现且准速度有一定保证的话&#xff0c;就可以作为…

使用Qt+Visual Stuidio写一个简单的音乐播放器(1)

1.使用QMediaPlayer播放音乐 第三步:在代码头部加上: #include <QtMultimedia/QMediaPlayer> // VS向.pro文件添加代码的方式 #pragma execution_character_set("utf-8") // qt支持显示中文 QMediaPlayer类是一个高级媒体播放类。它可以用来播放歌曲、电…

超分CAMixerSR 使用笔记

目录 超分CAMixerSR 笔记 自己改进的图例示例: 修改目录: 设置预训练模型: 超分CAMixerSR 笔记 自己改进的图例示例: 修改目录: codes/basicsr改为codes/basicsr_m 设置预训练模型: path:pretrain_network_g: F:\project\chaofen\CAMixerSR-main\pretrained_mode…

C++初学(14)

14.1、while循环 和for循环相比&#xff0c;while循环没有初始化和更新部分&#xff0c;它只有测试条件和循环体。 while(text-condition)body首先程序计算圆括号内的测试条件&#xff08;text-condition&#xff09;表达式。如果该表达式为ture&#xff0c;则执行循环体中的…

Docker快速上手

Docker 前言一、基本组成二、常用命令2.1 Docker服务2.2 image相关命令2.3 Container相关命令 三、Docker Volume 容器卷3.1 匿名挂载3.2 具名挂载 四、Docker 网络模式4.1 bridge桥接模式4.2 host主机模式4.3 None模式4.4 Container模式4.5 Customer模式 前言 本篇文章不再赘…

读软件开发安全之道:概念、设计与实施08密码学(下)

1. 对称加密 1.1. symmetric encryption 1.2. 使用各方共享的密钥来隐藏数据 1.2.1. 对称加密在本质上依赖共享密钥 1.3. 所有加密都是通过对明文进行转换&#xff0c;把明文消息&#xff08;或者原始消息&#xff09;变成无法识别的形式&#xff08;也称为密文&#xff09…

我的CSDN-----第128天创作纪念日

机缘 起初的我&#xff0c;是为了在学习代码的过程中通过写博客的方式来巩固自己的知识。后来在遇到不会的问题时可以在csdn上面查找&#xff0c;寻求一点思路&#xff0c;将学到的知识通过博客的方式呈现出来。 收获 每当发布一篇博客后&#xff0c;就会收到很多人的评论加关…

Adobe Animate (AN)软件安装,硬件配置(附安装包)

目录 一、Adobe An 软件简介 Adobe An 软件的特点 Adobe An 软件的优势 下载 二、Adobe An 软件安装 安装前的准备工作 安装过程中的注意事项 安装后的设置 三、Adobe An 软件使用 高级动画技巧 交互设计 优化与性能提升 四、Adobe An 软件快捷键 选择工具快捷键…

Linux 下命令行参数和环境变量

Linux 下命令行参数和环境变量 命令行参数为什么要有命令行参数谁可以做到结论 环境变量一些现象查看环境变量添加环境变量添加内存级环境变量永久有效 其他环境变量HOMEPWDSHELLHISTSIZE 自定义环境变量定义取消 本地变量整体理解环境变量环境变量的组织方式Linux 代码获取环境…

【机器人学】7-2.六自由度机器人自干涉检测-计算圆柱体的上下圆心坐标【附MATLAB代码】

目录 前言 机械臂几何参数 机器等效圆柱体坐标确定 MATLAB代码 前言 上一章介绍了机器人自干涉检测的总体算法&#xff0c;提出了算法的三个核心&#xff1a; 一 根据机械臂的几何数据以及DH参数&#xff0c;确定机械臂等效的圆柱体的上下圆心坐标。 二 将一个圆柱体旋转到…

vue.js - 看板娘 Live2d

文中的资源文件在这里&#xff1a;我的资源中&#xff0c;打好包了已经&#xff0c;地址&#xff1a;live2d资源 1、在项目的 src/assets 文件夹中&#xff0c;添加 live2d 的资源文件 2、在 src/components 文件中&#xff0c;编写 live2d的index.vue组件 3、在 App.vue 中…

【重点】人工智能大语言模型技术发展研究报告2024|附下载

人工智能作为引领新一轮科技产业革命的战略性技术和新质生产力重要驱动力&#xff0c;正在引发经济、社会、文化等领域的变革和重塑。 2023 年以来&#xff0c;以ChatGPT、GPT-4 为代表的大模型技术的出台&#xff0c;因其强大的内容生成及多轮对话能力&#xff0c;引发全球新…

MYSQL————数据库的约束

1.约束类型 1.not null&#xff1a;指示某列不能存储null值 2.unique&#xff1a;保证某列的每行必须有唯一值 3.default&#xff1a;规定没有给列赋值时的默认值 4.primary key&#xff1a;not null和unique的结合。确保某列&#xff08;或两个或多个列的结合&#xff09;有唯…

聊聊最近很火的后端即服务

最近&#xff0c;你可能经常听到“后端即服务”&#xff08;Backend as a Service, BaaS&#xff09;这个词。不论是在技术论坛上&#xff0c;还是在开发者社区&#xff0c;BaaS都成了大家讨论的热点。究竟是什么让这个概念如此火爆&#xff1f;今天我们就来聊聊这个话题&#…

TCP粘包和抓包

在 TCP 套接字中&#xff0c;发送和接收缓冲区用于暂存数据&#xff0c;以确保数据的可靠传输。具体来说&#xff0c;TCP 的 socket 收发缓冲区的主要特点和概念如下&#xff1a; 1. 发送缓冲区&#xff08;Send Buffer&#xff09; 定义: 发送缓冲区用于存储待发送的数据。应…

大模型从入门到精通——词向量及知识库介绍

词向量及知识库介绍 1.词向量 1.1 什么是词向量 词向量是一种将单词表示为实数向量的方式。每个单词通过一个高维向量来表示&#xff0c;向量的每一维都是一个实数&#xff0c;这些向量通常位于一个高维空间中。词向量的目标是将语义相似的单词映射到相邻的向量空间中&#…

自定义@ResponseBody以及SpringMVC总结

文章目录 1.需求分析2.目录3.自定义ResponseBody注解4.MonsterController.java5.Monster.java 实现序列化接口6.引入jackson7.Adapter.java 如果有ResponseBody注解就返回json8.测试9.SpringMVC执行流程 1.需求分析 2.目录 3.自定义ResponseBody注解 package com.sunxiansheng…

24暑假算法刷题 | Day39 | 动态规划 VII | LeetCode 198. 打家劫舍,213. 打家劫舍 II,337. 打家劫舍 III

目录 198. 打家劫舍题目描述题解 213. 打家劫舍 II题目描述题解 337. 打家劫舍 III题目描述题解 打家劫舍的一天 &#x1f608; 198. 打家劫舍 点此跳转题目链接 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷…

(贪心) LeetCode 135. 分发糖果

原题链接 一. 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xf…