JS生成用户登录图形验证码

生成用户登录图形验证码的过程可以通过几个步骤来实现,包括创建画布,生成随机验证码文本,将验证码文本绘制到画布上,以及添加一些噪点和线条来增加复杂性。

HTML

首先,在HTML文件中创建一个<canvas>元素和一个按钮来触发验证码的生成:

<body><div class="code"><!-- 用户名输入框 -->用户名:<input type="text"><br><!-- 密码输入框 -->密&nbsp;&nbsp;&nbsp;码:<input type="text"><br><!-- 验证码输入框 -->验证码:<input type="text" value="" id="inputValue" placeholder="请输入验证码(不区分大小写)"><!-- canvas画布框 --><canvas id="c1" width="100" height="30" style="border:1px solid black"></canvas><br><!-- 登录按钮 --><button id="btn">登录</button></div></body>

 

JavaScript

然后,引入jQuery

<script src="./js/jquery-3.7.1.js"></script>

 创建一个函数来把随机验证码放到画布上

// 封装一个把随机验证码放在画布上function draw(showNum) {}

然后获取canvas的相关信息

// 获取canvasvar canvas = $("#c1")
// 获取一个 <canvas> 元素的2D渲染上下文var ctx = canvas[0].getContext("2d")

const ctx = canvas.getContext('2d'); 这行代码的作用是获取一个HTML5 <canvas> 元素的2D渲染上下文。一旦你有了这个上下文,你就可以使用各种绘图方法来绘制形状、路径、文本、图像等内容到 <canvas> 元素上。

接着获取画布的宽度

var canvas_width = canvas.width()var canvas_height = canvas.height()

清空之前的内容,从0,0开始绘制,设置矩形宽高

ctx.clearRect(0, 0, canvas_width, canvas_height)

ctx.clearRect(0, 0, canvas_width, canvas_height) 是用来清空画布的。在 Canvas 绘图上下文中,这行代码将清除整个画布,也就是说,画布上的所有内容都将被删除。

这个方法的参数是左上角的 x 坐标,左上角的 y 坐标,宽度和高度。在这里,(0, 0) 是起始位置(即左上角),canvas_width 和 canvas_height 分别是画布的宽度和高度。因此,这个方法将清除整个画布。

在绘图或动画之前,通常会先调用这个方法来清空画布,以便从头开始绘制

开始绘制

声明一个变量为a-z小写字母,A-Z大写字母,1-9的数字的字符串

var scode ="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,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,1,2,3,4,5,6,7,8,9,"

 接着,使用 split(",") 方法将这个字符串按照逗号分隔成一个数组,并将结果赋值给 arrCode

 同时声明一个变量等于这个数组的长度

var arrCode = scode.split(",")var arrLength = arrCode.length

使用 Math.random() 和 Math.floor() 从 arrCode 数组中随机选择一个索引。

var index = Math.floor(Math.random() * arrCode.length)

随机一个字符

var txt = arrCode[index] //随机一个字符

将字符转化为小写存入验证码数组

showNum[i] = txt.toLowerCase() //转化为小写存入验证码数组

开始控制字符绘制位置

// 开始控制字符的绘制位置var x = 10 + 20 * i //每一个验证码绘制的起始点x坐标var y = 20 + Math.random() * 8 // 起始点y坐标ctx.font = "bold 20px 微软雅黑"

旋转字符

// 开始旋转字符var deg = Math.random * -0.5

倾斜字符

// canvas 要实现绘制内容具有倾斜的效果,必须先平移,目的是把旋转点移动到绘制内容的地方ctx.translate(x, y)ctx.rotate(deg)

设置随机颜色

// 设置绘制的随机颜色ctx.fillStyle = randomColor()ctx.fillText(txt, 0, 0)

还原canvas

// 把canvas复原ctx.rotate(-deg)ctx.translate(-x, -y)

开始一个新的路径

// 循环判断i小于30for (var i = 0; i < 30; i++) {// 如果i小于5if (i < 5) {// 绘制线ctx.strokeStyle = randomColor()// 开始路径ctx.beginPath()// 在 Canvas 绘图上下文中将当前路径的起始点移动到画布上的一个随机位置。ctx.moveTo(Math.random() * canvas_width, Math.random() * canvas_height)// 在 Canvas 绘图上下文中从当前路径的最后一个点绘制一条直线到一个新的随机位置。ctx.lineTo(Math.random() * canvas_width, Math.random() * canvas_height)// 绘制路径ctx.stroke()}// 绘制点ctx.strokeStyle = randomColor()ctx.beginPath()var x = Math.random() * canvas_widthvar y = Math.random() * canvas_heightctx.moveTo(x, y)ctx.lineTo(x + 1, y + 1)ctx.stroke()}

随机一个颜色

// 随机颜色生成一个随机的 RGB 颜色值function randomColor() {var r = Math.floor(Math.random() * 256)var g = Math.floor(Math.random() * 256)var b = Math.floor(Math.random() * 256)return `rgb(${r},${g},${b})`}

 然后调用这个封装的函数

$(function() {// 存放随机的验证码var showNum = []draw(showNum)$("#c1").click(function() {draw(showNum)})$("#btn").click(function() {var s = $("#inputValue").val().toLowerCase()var s1 = showNum.join("")if (s == s1) {alert("提交成功")} else {alert("验证码错误")}draw(showNum)})

整体部分:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="./js/jquery-3.7.1.js"></script><title>Document</title><style>input {width: 200px;height: 32px;border: 1px solid #000;box-sizing: border-box;margin-top: 2px;}#c1 {vertical-align: middle;box-sizing: border-box;cursor: pointer;}#btn {display: block;margin-top: 20px;height: 32px;font-size: 16px;}</style></head><body><div class="code"><!-- 用户名输入框 -->用户名:<input type="text"><br><!-- 密码输入框 -->密&nbsp;&nbsp;&nbsp;码:<input type="text"><br><!-- 验证码输入框 -->验证码:<input type="text" value="" id="inputValue" placeholder="请输入验证码(不区分大小写)"><!-- canvas画布框 --><canvas id="c1" width="100" height="30" style="border:1px solid black"></canvas><br><!-- 登录按钮 --><button id="btn">登录</button></div></body><script>$(function() {// 存放随机的验证码var showNum = []draw(showNum)$("#c1").click(function() {draw(showNum)})$("#btn").click(function() {var s = $("#inputValue").val().toLowerCase()var s1 = showNum.join("")if (s == s1) {alert("提交成功")} else {alert("验证码错误")}draw(showNum)})// 封装一个把随机验证码放在画布上function draw(showNum) {// 获取canvasvar canvas = $("#c1")// 获取一个 <canvas> 元素的2D渲染上下文var ctx = canvas[0].getContext("2d")// 获取画布的宽高var canvas_width = canvas.width()var canvas_height = canvas.height()//  清空之前绘制的内容// 0,0清空的起始坐标// 矩形的宽高ctx.clearRect(0, 0, canvas_width, canvas_height)// 开始绘制var scode ="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,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,1,2,3,4,5,6,7,8,9,"var arrCode = scode.split(",")var arrLength = arrCode.length//循环判断i是否小于4for (var i = 0; i < 4; i++) {// 使用 Math.random() 和 Math.floor() 从 arrCode 数组中随机选择一个索引。var index = Math.floor(Math.random() * arrCode.length)var txt = arrCode[index] //随机一个字符showNum[i] = txt.toLowerCase() //转化为小写存入验证码数组// 开始控制字符的绘制位置var x = 10 + 20 * i //每一个验证码绘制的起始点x坐标var y = 20 + Math.random() * 8 // 起始点y坐标ctx.font = "bold 20px 微软雅黑"// 开始旋转字符var deg = Math.random * -0.5// canvas 要实现绘制内容具有倾斜的效果,必须先平移,目的是把旋转点移动到绘制内容的地方ctx.translate(x, y)ctx.rotate(deg)// 设置绘制的随机颜色ctx.fillStyle = randomColor()ctx.fillText(txt, 0, 0)// 把canvas复原ctx.rotate(-deg)ctx.translate(-x, -y)}// 循环判断i小于30for (var i = 0; i < 30; i++) {// 如果i小于5if (i < 5) {// 绘制线ctx.strokeStyle = randomColor()// 开始路径ctx.beginPath()// 在 Canvas 绘图上下文中将当前路径的起始点移动到画布上的一个随机位置。ctx.moveTo(Math.random() * canvas_width, Math.random() * canvas_height)// 在 Canvas 绘图上下文中从当前路径的最后一个点绘制一条直线到一个新的随机位置。ctx.lineTo(Math.random() * canvas_width, Math.random() * canvas_height)// 绘制路径ctx.stroke()}// 绘制点ctx.strokeStyle = randomColor()ctx.beginPath()var x = Math.random() * canvas_widthvar y = Math.random() * canvas_heightctx.moveTo(x, y)ctx.lineTo(x + 1, y + 1)ctx.stroke()}}// 随机颜色生成一个随机的 RGB 颜色值function randomColor() {var r = Math.floor(Math.random() * 256)var g = Math.floor(Math.random() * 256)var b = Math.floor(Math.random() * 256)return `rgb(${r},${g},${b})`}})</script>
</html>

 

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

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

相关文章

动态规划_最小花费爬楼

//给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 // // 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 // // 请你计算并返回达到楼梯顶部的最低花费。 …

Springboot获取jar版本方法

Springboot获取jar版本方法 方案一: 通过jar的pom.properties文件获取 获取demo Properties properties new Properties(); try {properties.load(RakicAppInfo.class.getResourceAsStream("/META-INF/maven/com.rakic.framework/rakic-app-springboot-start/pom.pro…

理解基于 Hadoop 生态的大数据技术架构

转眼间&#xff0c;一年又悄然而逝&#xff0c;时光荏苒&#xff0c;岁月如梭。当回首这段光阴&#xff0c;不禁感叹时间的匆匆&#xff0c;仿佛只是一个眨眼的瞬间&#xff0c;一年的旅程已成为过去&#xff0c;而如今又到了画饼的时刻了 &#xff01; 基于 Hadoop 生态的大数…

13.触发器

目录 1、创建触发器 1、创建只有一个执行语句的触发器 2、创建有多个执行语句的触发器 2、查看触发器 1、通过SHOW TRIGGERS查看触发器: 2.在triggers 表中查看触发器信息 3、使用触发器 4、删除触发器 1、创建触发器 MySQL 的触发器和存储过程一样&#xff0c;都是嵌…

详解ZNS SSD基本原理

ZNS SSD的原理是把namespace空间划分多个zone空间&#xff0c;zone空间内部执行顺序写。这样做的优势&#xff1a; 降低SSD内部的写放大&#xff0c;提升SSD的寿命 降低OP空间&#xff0c;host可以获得更大的使用空间 降低SSD内部DRAM的容量&#xff0c;降低整体的SSD成本 降…

【利用二手车数据进行可视化分析】

利用二手车数据进行可视化分析 查看原始数据去除重复数据需求分析1.统计全国总共有多少量二手车&#xff0c;用KPI图进行展示2.统计安徽总共有多少量二手车&#xff0c;用KPI图进行展示3.统计合肥总共有多少量二手车&#xff0c;用KPI图进行展示4.取最贵的10辆二手车信息&#…

【Table/SQL Api】Flink Table/SQL Api表转流读取MySQL

引入依赖 jdbc依赖 flink-connector-jdbc mysql-jdbc-driver 操作mysql数据库 <!-- Flink-Connector-Jdbc --><dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-jdbc_${scala.binary.version}</artifactId>…

金融行业文件摆渡,如何兼顾安全和效率?

金融行业是数据密集型产业&#xff0c;每时每刻都会产生海量的数据&#xff0c;业务开展时&#xff0c;数据在金融机构内部和内外部快速流转&#xff0c;进入生产的各个环节。 为了保障基础的数据安全和网络安全&#xff0c;金融机构采用网络隔离的方式来隔绝外部网络的有害攻击…

苹果IOS在Safari浏览器中将网页添加到主屏幕做伪Web App,自定义图标,启动动画,自定义名称,全屏应用pwa

在ios中我们可以使用Safari浏览自带的将网页添加到主屏幕上&#xff0c;让我们的web页面看起来像一个本地应用程序一样&#xff0c;通过桌面APP图标一打开&#xff0c;直接全屏展示&#xff0c;就像在APP中效果一样&#xff0c;完全体会不到你是在浏览器中。 1.网站添加样式 在…

《算法与数据结构》答疑

答疑 问题一问题二问题三问题四 问题一 在匹配成功时&#xff0c;在返回子串位置那里&#xff0c;为什么不是i-t的长度啊&#xff0c;为什么还要加一 问题二 问题三 问题四 问&#xff1a;如果题目让我们构造一个哈夫曼树&#xff0c;像我发的这个例题的话&#xff0c;我画成我…

详解异常 ! !(对异常有一个全面的认识)

【本章目标】 1. 异常概念与体系结构 2. 异常的处理方式 3. 异常的处理流程 4. 自定义异常类 1. 异常的概念与体系结构 1.1 异常的概念 在生活中&#xff0c;一个人表情痛苦&#xff0c;出于关心&#xff0c;可能会问&#xff1a;你是不是生病了&#xff0c;需要我陪你去看医…

零基础一看就会?Python实现性能自动化测试竟然如此简单

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈自动化测试 使用程序代替手工提升测试效率性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能自动化…