原生JavaScript實(shí)現(xiàn)簡(jiǎn)單的圖形驗(yàn)證碼
前天接到需求要在老項(xiàng)目登陸界面加上驗(yàn)證碼功能,因?yàn)槭莾?nèi)部項(xiàng)目且無(wú)需短信驗(yàn)證環(huán)節(jié),那就直接用原生js寫一個(gè)簡(jiǎn)單的圖形驗(yàn)證碼。
示例:

思路:此處假設(shè)驗(yàn)證碼為4位隨機(jī)數(shù)值,數(shù)值刷新滿足兩個(gè)條件①頁(yè)面新進(jìn)/刷新。②點(diǎn)擊圖片刷新。(實(shí)際情況下還要考慮登錄出錯(cuò)刷新,此處只做樣式不寫進(jìn)去) 實(shí)現(xiàn)過(guò)程為1.先寫一個(gè)canvas標(biāo)簽做繪圖容器。 → 2.將拿到的值繪制到容器中并寫好樣式。 → 3.點(diǎn)擊刷新重新繪制。
寫一個(gè)canvas標(biāo)簽當(dāng)容器
<canvas
style="width: 100px;border: 2px solid rgb(60, 137, 209);background-image: url('https://gd-hbimg.huaban.com/aa3c7f23dfdc7b2d317aa4b77bd6c7b8469564d2dfa8b-Btd5c6_fw658webp');"
id="captchaCanvas"></canvas>
并設(shè)置容器寬高背景顏色或圖片等樣式
寫一個(gè)數(shù)值繪制到canvas的方法
//text為傳遞的數(shù)值
function generateCaptcha(text, callback) {
var canvas = document.getElementById('captchaCanvas');
var ctx = canvas.getContext('2d');
// 設(shè)置字體及大小
ctx.font = '100px Comic Sans MS';
// 設(shè)置字體顏色
ctx.fillStyle = 'rgb(' + Math.floor(Math.random() * 256) + ', ' + Math.floor(Math.random() * 256) + ', ' + Math.floor(Math.random() * 256) + ')';
// 調(diào)整文字圖形位置
ctx.textAlign = 'left';
ctx.textBaseline = 'top';
// 調(diào)整陰影范圍
ctx.shadowBlur = Math.random() * 20;
// 調(diào)整陰影顏色
ctx.shadowColor = 'rgb(' + Math.floor(Math.random() * 256) + ', ' + Math.floor(Math.random() * 256) + ', ' + Math.floor(Math.random() * 256) + ')';
// 調(diào)整陰影位置(偏移量)
ctx.shadowOffsetX = Math.random() * 10;
ctx.shadowOffsetY = Math.random() * 10;
// 繪制文字圖形及其偏移量
ctx.fillText(text, 25, 35);
// 繪制文字邊框及其偏移量
ctx.strokeText(text, Math.random() * 35, Math.random() * 45);
var imgDataUrl = canvas.toDataURL();
callback(imgDataUrl);
}
拿到數(shù)值調(diào)用繪制方法
此處為樣式示例,因此數(shù)值我用4位隨機(jī)數(shù)表示,實(shí)際情況為你從后端取得的值,并依靠這個(gè)值在后端判斷驗(yàn)證碼是否一致。
// 調(diào)用函數(shù)生成驗(yàn)證碼并顯示在頁(yè)面上
generateCaptcha(Math.floor(Math.random() * 9000) + 1000, function (imgDataUrl) { });
監(jiān)聽標(biāo)簽點(diǎn)擊實(shí)現(xiàn)點(diǎn)擊刷新
此處要注意一定要先清空canvas中已繪制圖像再渲染新數(shù)值,因此直接將清除范圍設(shè)置較大。
// 監(jiān)聽點(diǎn)擊更新驗(yàn)證碼
document.getElementById("captchaCanvas").addEventListener("click", function (event) {
// 清空畫布
document.getElementById("captchaCanvas").getContext("2d").clearRect(0, 0, 9999, 9999);
// 調(diào)用函數(shù)生成驗(yàn)證碼并顯示在頁(yè)面上
generateCaptcha(Math.floor(Math.random() * 9000) + 1000, function (imgDataUrl) { });
})
最后實(shí)現(xiàn)效果:

完整代碼演示
<!DOCTYPE html>
<html>
<head>
<title>String to Captcha</title>
</head>
<body>
<canvas
style="width: 100px;border: 2px solid rgb(60, 137, 209);background-image: url('https://gd-hbimg.huaban.com/aa3c7f23dfdc7b2d317aa4b77bd6c7b8469564d2dfa8b-Btd5c6_fw658webp');"
id="captchaCanvas"></canvas>
<script>
// 監(jiān)聽點(diǎn)擊更新驗(yàn)證碼
document.getElementById("captchaCanvas").addEventListener("click", function (event) {
// 清空畫布
document.getElementById("captchaCanvas").getContext("2d").clearRect(0, 0, 9999, 9999);
// 調(diào)用函數(shù)生成驗(yàn)證碼并顯示在頁(yè)面上
generateCaptcha(Math.floor(Math.random() * 9000) + 1000, function (imgDataUrl) { });
})
function generateCaptcha(text, callback) {
var canvas = document.getElementById('captchaCanvas');
var ctx = canvas.getContext('2d');
// 設(shè)置字體及大小
ctx.font = '100px Comic Sans MS';
// 設(shè)置字體顏色
ctx.fillStyle = 'rgb(' + Math.floor(Math.random() * 256) + ', ' + Math.floor(Math.random() * 256) + ', ' + Math.floor(Math.random() * 256) + ')';
// 調(diào)整文字圖形位置
ctx.textAlign = 'left';
ctx.textBaseline = 'top';
// 調(diào)整陰影范圍
ctx.shadowBlur = Math.random() * 20;
// 調(diào)整陰影顏色
ctx.shadowColor = 'rgb(' + Math.floor(Math.random() * 256) + ', ' + Math.floor(Math.random() * 256) + ', ' + Math.floor(Math.random() * 256) + ')';
// 調(diào)整陰影位置(偏移量)
ctx.shadowOffsetX = Math.random() * 10;
ctx.shadowOffsetY = Math.random() * 10;
// 繪制文字圖形及其偏移量
ctx.fillText(text, 25, 35);
// 繪制文字邊框及其偏移量
ctx.strokeText(text, Math.random() * 35, Math.random() * 45);
var imgDataUrl = canvas.toDataURL();
callback(imgDataUrl);
}
// 調(diào)用函數(shù)生成驗(yàn)證碼并顯示在頁(yè)面上
generateCaptcha(Math.floor(Math.random() * 9000) + 1000, function (imgDataUrl) { });
</script>
</body>
</html>
到此這篇關(guān)于原生JavaScript實(shí)現(xiàn)簡(jiǎn)單的圖形驗(yàn)證碼的文章就介紹到這了,更多相關(guān)JavaScript圖形驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
加載遠(yuǎn)程圖片時(shí),經(jīng)常因?yàn)榫彺娑貌坏礁碌慕鉀Q方法(分享)
本篇文章是對(duì)加載遠(yuǎn)程圖片時(shí),經(jīng)常因?yàn)榫彺娑貌坏礁碌慕鉀Q方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
javascript中運(yùn)用閉包和自執(zhí)行函數(shù)解決大量的全局變量問題
做為一個(gè)javascript新手,為了程式的簡(jiǎn)便,可能會(huì)在javascript中運(yùn)用了大量的全局變量,雖然一時(shí)看來(lái),問題解決了,而且也可能讓編碼變得更加的簡(jiǎn)單。2010-12-12
JavaScript 獲取 URL 中參數(shù)值的方法詳解(最新整理)
本文將詳細(xì)介紹幾種在 JavaScript 中獲取 URL 參數(shù)值的方法,包括現(xiàn)代瀏覽器支持的 URLSearchParams、正則表達(dá)式解析以及自定義函數(shù)解析方案,并討論各自的優(yōu)缺點(diǎn)及適用場(chǎng)景,感興趣的朋友一起看看吧2025-04-04
JavaScript每天必學(xué)之?dāng)?shù)組和對(duì)象部分
JavaScript每天必學(xué)之?dāng)?shù)組和對(duì)象部分,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
javascript實(shí)現(xiàn)網(wǎng)站加入收藏功能
這篇文章主要介紹了javascript實(shí)現(xiàn)網(wǎng)站加入收藏功能的相關(guān)資料,需要的朋友可以參考下2015-12-12
JavaScript獲取多個(gè)數(shù)組的交集簡(jiǎn)單實(shí)例
這篇文章介紹了JavaScript獲取多個(gè)數(shù)組的交集簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下2013-11-11

