jquery实现文字点选验证码

jquery实现文字点选验证码

git地址:点击获取源码

一、功能说明(文字点选验证码)

  1. 词组库内存在大量3~6字随机词组,
  2. 从词组库内随机找出一组词组,随机展现在显示区
  3. 点击按钮,弹出验证码区域
  4. 将词组内的随机数量文字随机顺序作为验证文本进行校验
  5. 点击文字添加标记并计数,当点击次数与验证文本数量一致,自动校验
  6. 验证通过后,提示成功,关闭验证区域
  7. 验证失败,提示失败,刷新验证码
  8. 点击显示区内刷新按钮,刷新验证码

二. 效果图:

在这里插入图片描述

三、代码:

  1. 验证区htmlindex.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" type="text/css" href="css/index.css" /><style>.my-container {position: relative;top: 20px;left: 50px;}</style>
</head><body><div class="my-container"><input type="text"><button id="btn">点击触发验证码</button></div><!-- 验证码区域 --><div id="verification"><!-- 刷新 --><div class="refresh"></div><!-- 验证结果 --><div id="resultBox"></div><!-- 验证词组显示区 --><div id="box"></div></div><script src="js/jquery-1.9.1.min.js"></script><!-- 引入验证区js --><script src="js/index.js" type="text/javascript" charset="utf-8"></script><script>/*** 点击按钮显示验证区,初始化验证区*/$('#btn').click(() => {$('#verification').show()init();})</script></body></html>
  1. 验证区js:index.js
// TODO获取词库
$(function () {fetch("/js/data.json").then((response) => response.json()) // 解析JSON响应.then((response) => {textData = response.data;}).catch((error) => console.error("Error:", error));
});/*** @constant box 容器* @variate place 文字分散在容器中的随机位置* @variate textData 文字库集合* @variate verifyWord 需要校验的词组,用于渲染布局* @constant minVerifyWordLen 随机文字最小数量* @variate verifyText 需要校验的随机文字,用于展示* @variate verifyTextIdxs 需要校验的文本,取verifyText的index值* @variate verifyClickCount 点击校验文字的次数,达到verifyTextIdxs长度进行校验* @variate selectedIdxs 选中文字的index集合*/const box = $("#box");
let place = [{ left: "0px", top: "0px" },{ left: "120px", top: "0px" },{ left: "240px", top: "0px" },{ left: "0px", top: "90px" },{ left: "120px", top: "90px" },{ left: "240px", top: "90px" },
];let textData = [];
let verifyWord = "";
const minVerifyWordLen = 3;
let verifyText = "";
let verifyTextIdxs = [];
let verifyClickCount = 0;
let selectedIdxs = [];/*** @function getVerifyWord 获取随机校验词组*/function getVerifyWord() {return textData[Math.floor(Math.random() * (textData.length - 1))];
}/*** @function getVerifyText 获取随机校验文字*/
function getVerifyText() {// 随机选取校验文字数量let lenRandom = Math.ceil(Math.random() * verifyWord.length);if (lenRandom < minVerifyWordLen) {lenRandom = minVerifyWordLen;}const verifyArray = verifyWord.split("");const result = [];// 获取随机需要校验的文字for (let i = 0; i < lenRandom; i++) {let index = Math.floor(Math.random() * verifyArray.length);result.push(verifyArray[index]);verifyArray.splice(index, 1); // 移除已选的元素以避免重复}return result.join("");
}/*** @function getVerifyText 获取校验文字的idx*/
function getVerifyTextIdxs() {const wordArray = verifyWord.split("");const textArray = verifyText.split("");const result = [];for (let text of textArray) {const idx = wordArray.findIndex((word) => word === text);result.push(idx);}return result;
}/*** @function clear 重置*/
function clear() {box.empty();verifyWord = getVerifyWord();verifyText = getVerifyText();verifyTextIdxs = getVerifyTextIdxs();verifyClickCount = 0;selectedIdxs = [];$("#resultBox").html(`请依次点击: <span>${verifyText}</span>`);place.sort(() => {return Math.random() - 0.5;});
}/*** @function init 初始化*/
function init() {// 重置内容clear();verifyWord.split("").map((text, idx) => {createVerifyBox(text, idx);});/*** 创建存放每个校验文字的容器* @param {string} text 文字* @param {number} idx 索引* @attribute {number} index 文字标签的index值* @attribute {string: true | false } judge 判断标签是否被点击*/function createVerifyBox(text, idx) {//创建box分割的div容器let divEl = $('<div class="item"></div>');divEl.css({left: place[idx].left,top: place[idx].top,});//创建span标签存储校验文字let spanEl = $(`<span class="spanEl">${text}</span>`);divEl.append(spanEl);box.append(divEl);addSpanElCss(divEl, spanEl);// 添加属性,// 用于存入selectedIdxsspanEl.data("index", idx);spanEl.data("judge", "true");}/*** 添加span项样式*/function addSpanElCss(divEl, spanEl) {const lt = divEl.width() - spanEl.width() - 10;const rt = divEl.height() - spanEl.height() - 10;let left = Math.floor(Math.random() * lt);let top = Math.floor(Math.random() * rt);spanEl.css({left: left + "px",top: top + "px",});}//span点击事件$("#box .item span").click(function (e) {if ($(this).data("judge") == "true") {selectedIdxs.push($(this).data("index"));console.log(selectedIdxs, "selectedIdxs", verifyTextIdxs);$(this).data("judge", "false");verifyClickCount++;appendRadio(e);// 验证if (verifyClickCount === verifyTextIdxs.length) {getVerifyResult();}}});//点击事件,生成圆点function appendRadio(e) {const radioEl = $(`<div class='radio'>${verifyClickCount}</div>`);box.append(radioEl);const wt = radioEl.width() / 2;const ht = radioEl.height() / 2;radioEl.css({left: e.pageX - box.offset().left - wt + "px",top: e.pageY - box.offset().top - ht + "px",});}
}/*** @function getVerifyResult 获取校验结果*/
function getVerifyResult() {if (selectedIdxs.join() == verifyTextIdxs.join()) {$("#resultBox span").html("验证成功");$("#resultBox span").css("color", "#1abd6c");setTimeout(() => {$("#verification").hide();}, 500);// TODO 验证成功后操作} else {$("#resultBox span").html("验证失败");$("#resultBox span").css("color", "red");setTimeout(() => {init();}, 500);}verifyClickCount = 0;
}/*** @function 刷新*/
$(".refresh").click(() => {init();
});
  1. 验证区css: index.css
#verification {position: absolute;top: 60px;left: 50px;display: none;
}/* 刷新 */
#verification .refresh{position: absolute;top: 50px;right: 10px;z-index: 10;width: 28px;height: 28px;cursor: pointer;background-image: url("/img/refresh.png");background-size: 100% 100%;
}#box{position: relative;width: 360px;height: 180px;padding: 0 20px;border-radius: 10px;background-image: url("/img/bg.png");background-repeat: no-repeat;
}#box .item{position: absolute;width: 120px;height: 90px;
}#box .radio{position: absolute;z-index: 10;width: 30px;height: 30px;line-height: 30px;text-align: center;border-radius: 50%;color: #fff;background-color: #1abd6c;
}#box span{font-size: 40px;position: absolute;z-index: 4;color: #4463cb;font-weight: bold;
}#box span:hover{cursor: pointer;
}#resultBox{height: 40px;font-size: 18px;line-height: 40px;
}#resultBox span{font-size: 22px;font-weight: bold;color: #1f1f1f;
}
  1. 词库文件:data.json
{"data": ["快乐的大脚","阖家快乐","祝福您","萌新的快乐","彩色溜","恭喜发财祝您","假期愉快","天天开心呀","今天是好天气","美丽的神话","加菲猫","小马宝利","记得加油呀","巴啦啦小魔仙","大头儿子","疯狂动物城"]
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

4. docker镜像、Dockerfile

docker镜像、Dockerfile 一、docker镜像1、镜像介绍2、镜像核心技术 二、Dockerfile定制镜像1、Dockerfile使用流程1.1 编写Dockerfile1.2、构建镜像1.3 创建容器测试镜像定制操作 2、Dockerfile常用指令 一、docker镜像 1、镜像介绍 分层的文件系统 优势&#xff1a;节省空间…

vue3前端开发-小兔鲜项目-封装一下产品展示模块组件

vue3前端开发-小兔鲜项目-封装一下产品展示模块组件&#xff01;因为这种产品展示信息的模块组件&#xff0c;后面我还会在其他的页面内反复使用到&#xff0c;所以&#xff0c;使用模块化开发的思路&#xff0c;把它单独设计成一个组件&#xff0c;这样可以代码复用。以后在其…

一建备考,五步形成闭环学习!

一建备考从7月份到考前是大部分人焦虑的时候&#xff0c;因为基础阶段结束&#xff0c;开始成套做真题了&#xff0c;第一遍做真题很多人分数都不太理想&#xff0c;很多同学直接失去信心&#xff0c;开始emo&#xff0c;这都是只听课不做题的结果。 现在很多同学都是这种情况…

STM32智能家居电力管理系统教程

目录 引言环境准备智能家居电力管理系统基础代码实现&#xff1a;实现智能家居电力管理系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;电力管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家居电…

【单片机毕业设计选题24072】-基于单片机的智能停车场管理系统

系统功能: 1.根据RFID卡卡号判断新老用户&#xff0c;老用户不计费直接放行&#xff0c;新用户放行时显示计费结果 2.显示屏显示车位剩余数量 3.检测车位有车亮红灯&#xff0c;无车亮绿灯&#xff0c;能够实现车位诱导 5.车辆出停车场时&#xff0c;能根据停车时间计算停车…

【香橙派】Orange pi AIpro开发板使用之普通照片转换为卡通

前言 最近有幸收到一份新款 OrangePi AIpro 开发板&#xff0c;之前手里也捣鼓过一些板子&#xff0c;这次尝试从零开始部署一个简单的后端服务。OrangePi AIpro 采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;可配16GB内存容量&#xff0c;各种复杂应…

Facebook Dating:社交平台的约会新体验

随着社交媒体的普及和技术的发展&#xff0c;传统的社交方式正在经历革新&#xff0c;尤其是在约会这个领域。Facebook作为全球领先的社交平台&#xff0c;推出了Facebook Dating&#xff0c;旨在为用户提供一个全新的约会体验。本文将探讨Facebook Dating如何重新定义社交平台…

c语言题目之打印单身狗

文章目录 一、题目二、思路三、代码实现 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 二、思路 第一步 首先这里先了解两个有关于位操作符异或的知识点 &#xff0c;异或操作符的规则是相同为0&#xff0c;相异为1 。 通过上面我们可以得…

双非一本嵌入式方向怎么学?

双非一本&#xff08;非“985”和“211”工程重点建设的本科院校&#xff09;的学生在学习嵌入式方向时&#xff0c;可以通过以下步骤和策略来系统地学习和提升自己。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学…

哈喽GPT-4o,程序员如何通过GPT-4o保护自己的合法权益

目录 一、法律研究Prompt&#xff1a;派遣合同和劳务外包合同有什么区别&#xff1f;详细说一下在被裁员时的区别&#xff1f; 二、法律条文检索Prompt&#xff1a;检索《劳动合同法》&#xff0c;以下情况属于第几条&#xff0c;如果公司进行技能考试&#xff0c;并以技能考试…

嵌入式物联网在医疗行业中的应用——案例分析

作者主页: 知孤云出岫 目录 嵌入式物联网在医疗行业中的应用——案例分析引言1. 智能病房监控1.1 实时患者监控系统 2. 智能医疗设备管理2.1 设备使用跟踪与维护 3. 智能药物管理3.1 药物分配与跟踪 4. 智能远程医疗4.1 远程患者监控与诊断 总结 嵌入式物联网在医疗行业中的应…

Rust Result 与可恢复的错误

Result 与可恢复的错误 大部分错误并没有严重到需要程序完全停止执行。有时&#xff0c;一个函数会因为一个容易理解并做出反应的原因失败。例如&#xff0c;如果因为打开一个并不存在的文件而失败&#xff0c;此时我们可能想要创建这个文件&#xff0c;而不是终止进程。 回忆…

3112. 访问消失节点的最少时间 Medium

给你一个二维数组 edges 表示一个 n 个点的无向图&#xff0c;其中 edges[i] [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。 同时给你一个数组 disappear &#xff0c;其中 disappear[i] 表示节点 i 从图中消失的时间点&#xff0…

华清数据结构day3 24-7-18

基于昨天代码增加增删改查功能 zy.h #ifndef ZY_H #define ZY_H #define MAX 100 //最大容量 //定义学生类型 struct Stu {char name[20];int age;double score; }; //定义班级类型 struct Class {struct Stu student[MAX]; //存放学生的容器int size; //实际…

CH552的bootload程序IAP直接对ROM-flash修改数据(未尝试)

手动写bootload程序的可能 1&#xff0c;根据ch552g的使用手册内容查看到 2&#xff0c;在下面的参考文件的IAP文件夹中看到IAP文件 参考 下面程序中并没有跳转到厂家bootload的过程&#xff0c;这是直接通过控制有关的寄存器对FLSH进行直接写入和修改&#xff0c;这样可以认…

格式工厂,将所有的ts文件,合并为mp4

1、下载格式工厂 格式工厂 官方主页 - 免费多功能的多媒体文件转换工具 2、打开软件&#xff1a;视频合并&混流项 3、添加ts文件 4、点击【确定】&#xff0c;回到首页 5、首页中&#xff0c;点击【开始】开始转&#xff1a; 6、完成以后&#xff0c;会播放音乐并且右下…

Mysql中的几种常见日志

引言 本文是对Mysql中几种常见日志及其作用的介绍 一、error log&#xff08;错误日志&#xff09; MySQL 中的 error log&#xff08;错误日志&#xff09;是一种非常重要的日志类型&#xff0c;它记录了 MySQL 服务器在启动、运行及关闭过程中遇到的所有重要事件、错误信…

从零开始读RocketMq源码(五)Message的消费流程解析

目录 前言 准备 拉取服务和重平衡服务启动 初识PullRequest 重平衡服务 对重平衡资源进行排序 MessageQueue消息队列集合来源 Consumer消费者集合数据来源 确定分配资源策略 执行分配策略 初始化ProcessQueue 初始化PullRequest 内存队列填充PullRequest 消息拉取…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(二)-定义和缩写

引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及A2X&#xff08;Aircraft-to-Everything&#xff09;服务的支持。 3GPP TS 23.256 技术规范&#xff1a; 【免费】3GPPTS23.256技术报告-无人机系…

从操作系统层面认识Linux

描述进程-PCB Linux操作系统下的PCB是: task_struct https://www.cnblogs.com/tongyan2/p/5544887.htmlhttps://www.cnblogs.com/tongyan2/p/5544887.html校招必背操作系统面试题-什么是 PCB&#xff08;进程控制块&#xff09; &#xff1f;_哔哩哔哩_bilibili校招必背操作系…