密码生成器(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.rhkb.cn/news/407567.html

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

相关文章

Vue3集成高德离线地图实践

1. 离线地图效果预览 2. 地图下载器下载离线地图 根据需要选择地图&#xff0c;我这边选择高德地图&#xff0c;层级选择0-15级别即可&#xff0c;进行下载 3. 放到nginx内网服务器 注意配置允许跨域 4. Vue3核心代码 // main.js // 初始化vue-amap initAMapApiLoader({o…

Android自定义简单TextView

自定义属性 <declare-styleable name"TextView"><!--name 属性名称format 格式&#xff1a;string 文字 color颜色dimension 宽高 字体大小 integer数字reference 资源引用(drawable)--><attr name"YiRanText" format"string"/&…

torchvision中的数据集使用

1.数据集&#xff1a; 自定义数据集transforms中的类 如何将数据集和transforms结合在一起&#xff1f; 以CIFAR10为列 2.CIFAR10数据集的下载与导入 import torchvisiontrain_settorchvision.datasets.CIFAR10(root"./dataset",trainTrue,downloadTrue) test_set…

判别分析2|Bayes判别分析|Fisher判别分析|软件求解

Bayes判别分析 引入先验信息 距离判别只要求知道总体的数字特征&#xff0c;不涉及总体的分布函数 当均值和协方差未知时&#xff0c;就用样本的均值和协方差矩阵做估计值。距离判别方法简单实用&#xff0c;但没有考虑到每个总体出现的机会大小&#xff0c;即先验概率&#…

Git的使用教程及常用语法03

七.如何从版本库中删除文件 第一种方式&#xff1a;直接在工作区删除文件&#xff0c;然后提交 rm ffile1.txt (注意&#xff1a;这个不是git命令&#xff0c;而是linux命令) 看到状态发现&#xff0c;文件file1.txt已经被删除&#xff0c;提示需要提交到暂存区。 因为我们只…

从开发到集成:视频美颜SDK与直播美颜API详解

在本文中&#xff0c;我们将详细探讨视频美颜SDK的开发过程及其与直播美颜API的集成方案&#xff0c;帮助开发者更好地理解和应用这些技术。 一、视频美颜SDK的开发概述 视频美颜SDK是一个用于实时视频处理的开发工具包&#xff0c;提供了包括磨皮、美白、瘦脸、眼睛放大等多…

盘古信息IMS MCM制造协同管理系统:为中小企业数字化转型量身打造的数字化方案

近年来&#xff0c;全球经济的不稳定性&#xff0c;给中小企业的经营和发展带来了巨大的挑战。为提升企业竞争力&#xff0c;中小企业纷纷谋求数字化转型路径&#xff0c;优化生产流程、提高运营效率、降低生产成本&#xff0c;以应对变幻莫测的市场环境。IMS MCM是盘古信息为广…

python爬虫521

爬虫521 记录 记录 最近想学爬虫&#xff0c;尝试爬取自己账号下的文章标题做个词云 csdn有反爬机制 原理我就不说啦 大家都写了 看到大家结果是加cookie 但是我加了还是521报错 尝试再加了referer 就成功了(╹▽╹) import matplotlib import requests from wordcloud impor…

TinaSDKV2.0 自定义系统开发

TinaSDKV2.0 自定义系统开发 什么是自定义系统&#xff1f; TinaSDK Kconfig界面配置 Tina Linux采用 Kconfig 机制对 SDK 和内核进行配置。 Kconfig 是一种固定格式的配置文件。Linux 编译环境中的 menuconfig 程序可以识别这种格式的配置文件&#xff0c;并提取出有效信息…

使用redis模拟cookie-session,例子:实现验证码功能

在前后端分离架构中不建议使用cookie-session机制实现端状态识别 原因&#xff1a; 1.前后端分离存在跨域问题&#xff0c;cookie无法共享 2.后台服务器一旦建立集群&#xff0c;可能导致session数据丢失&#xff0c;即后台有多台服务器&#xff0c;每个服务器存的session不一…

Flutter ListView控件

ListView是flutter中线性排列的可滚动的列表部件。ListView 是最常用的滚动小部件。它在滚动方向上一个接一个地显示其子项。在交叉轴上&#xff0c;子项需要填满 ListView。 如果非空&#xff0c;则 itemExtent 会强制子项在滚动方向上具有给定的范围。 如果非空&#xff0c;…

kafka的一个有趣问题(BUG)

这是我的第104篇原创文章 问题由来 在使用kafka时&#xff0c;创建topic&#xff0c;对某个topic进行扩分区的操作&#xff0c;想必大家肯定都使用过。尤其是集群进行扩容时&#xff0c;对流量较大的topic进行扩分区操作。一般而言&#xff0c;期望的效果是&#xff1a;新扩的分…

【Qt】常用控件QPushButton

常用控件QPushButton QWidget中涉及的各种属性/函数/使用方法&#xff0c;对Qt中的各种控件都是有效的。 QPushButton继承自QAbstractButton。这个类是抽象类&#xff0c;是其他按钮的父类。 QAbstractButton中和QPushButton相关性比较大的属性。 属性说明 text 按钮中的⽂本…

TCP/UDP的对比,粘包分包抓包,http协议

服务器端&#xff1a; 一、loop 127.0.0.1本地回环测试地址 二、tcp特点 面向连接、可靠传输、字节流 粘包问题&#xff1a;tcp流式套接字&#xff0c;数据与数据之间没有套接字&#xff0c;导致可能多次的数据粘到一起 解决方法&#xff1a;&#xff08;1&#xff09;规…

后端Java秋招面试中的自我介绍需要说什么?

本文主要面向校招/实习面试中求职后端开发岗位的同学&#xff0c;其他岗位/社招的同学也可以参考&#xff0c;道理都是相通的 1 背景 1.1为什么要认真准备自我介绍&#xff1f; 1. 必要性&#xff1a;在求职面试中&#xff0c;一般来说同学和面试官打过招呼之后第一项就是自…

html+css+js网页设计 电商 珠宝首饰电商3个页面

htmlcssjs网页设计 电商 珠宝首饰电商3个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1…

网络编程知识点总结

物理链路网络运输会话表示应用 物链网运会表应 实际的数据帧 TCP和UDP的异同&#xff08;笔试面试&#xff09; 主机&#xff1a;host 转换&#xff1a;to 网络&#xff1a;network uint32_t htonl(uint32_t hostlong); //将4字节无符号整数的主机字节序转换为网络字节序&a…

掌握语义内核(Semantic Kernel):如何使用Memories增强人工智能应用

随着人工智能领域的不断发展&#xff0c;语义内核&#xff08;Semantic Kernel&#xff09;的概念应运而生&#xff0c;为我们处理和理解庞大的数据集提供了新的视角。今天&#xff0c;我们将聚焦于语义内核中的一个核心概念——Memories&#xff0c;它是如何使我们的数据查询更…

QT中使用QAxObject类读取xlsx文件内容并显示在ui界面

一、源码 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();pr…

鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式

运行机制 共享好端端的一词&#xff0c;近些年被玩坏了&#xff0c;共享单车,共享充电宝,共享办公室&#xff0c;共享雨伞… 甚至还有共享女朋友&#xff0c;真是人有多大胆&#xff0c;共享有多大产。但凡事太尽就容易恶心到人&#xff0c;自己也一度被 共享内存 恶心到了&am…