js+canvas实现验证码功能


Posted in Javascript onSeptember 21, 2020

刚刚开始接触canvas,写个验证码小功能练练手,实现效果图如下:

js+canvas实现验证码功能

主要代码如下:

html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
 <link rel="stylesheet" href="index.css" rel="external nofollow" >
</head>
<body>
 <div class="wrapper">
 <div class="inputBox">
  <input type="text" class = 'inputCaptcha' placeholder = "请输入验证码">
  <span class="captchaIcon"></span>
 </div>
 <p class="errorText"></p>
 <div class="canvasBox">
  <div class="imageBox">
  <canvas width =300 height=80 id = 'canvasCaptcha'></canvas>
  <input type="button" class='refresh'>
  </div>
 </div>
 <button class="captchaSubmit">submit</button>
 </div>
 <script src='./jquery.js'></script>
 <script src = './index.js'></script>
</body>
</html>

css

* {
 margin: 0;
 padding: 0;
}

.wrapper {
 width: 345px;
 border: 1px solid #ccc;
 border-radius: 10px;
 padding: 20px 10px;
 margin: 30px 30px;
}

.inputBox {
 width: 345px;
 margin: 0 auto 10px;
 position: relative;
}

.inputBox .inputCaptcha {
 display: inline-block;
 height: 50px;
 width: 86%;
 text-indent: 1em;
 border: 1px solid #ddd;
 border-radius: 5px;
}

.inputBox .captchaIcon {
 display: none;
 position: absolute;
 top: 50%;
 right: 0px;
 margin-top: -16px;
 width: 32px;
 height: 32px;
 background-size: 100% 100%;
}

.errorText {
 width: 345px;
 margin: 0 auto;
 font-size: 12px;
 color: red;
 display: none;
}

.canvasBox {
 width: 345px;
 margin: 10px auto;
 position: relative;
}

#canvasCaptcha {
 border-radius: 10px;
}

.canvasBox .refresh {
 width: 34px;
 height: 34px;
 position: absolute;
 right: 0px;
 top: 50%;
 margin-top: -17px;
 border: 0;
 border-radius: 6px;
 background-image: url('./images/update.png');
 background-size: cover;
}

.captchaSubmit {
 padding: 10px 20px;
 background-color: #62b900;
 border: 0;
 font-size: 20px;
 border-radius: 5px;
 color: #fff;
}

js

var arr = [0,1,2,3,4,5,6,7,8,9];
for(var i = 65;i < 122;i++){
 if(i>90&&i<97){
 continue;
 }
 arr.push(String.fromCharCode(i));
}
//每个验证码可能出现的字母或数字(区分大小写)
var len = arr.length;
//验证码的长度
var canvasStr,value;
//验证码值
function createCanvas(){
 canvasStr = '';
 value = '';
 for(var i =0 ;i < 6;i++){
 var a = arr[Math.floor(Math.random()*len)];
 canvasStr += a+' ';
 value += a; 
 }
//canvas
 var oCanvas = document.getElementById('canvasCaptcha');
 var ctx = oCanvas.getContext('2d');
 var w = oCanvas.width;
 var h = oCanvas.height;
 var oImg = new Image();
 oImg.src = './images/bg.jpg';
 oImg.onload = function(){
 var pattern = ctx.createPattern(oImg,'repeat');
 ctx.fillStyle = pattern;
 ctx.fillRect(0,0,w,h); 
 ctx.fillStyle = '#ccc';
 ctx.textAlign = 'center';
 ctx.font = '46px Roboto Slab';
 ctx.setTransform(1,-0.12,0.2,1,0,12);
 ctx.fillText(canvasStr,w/2,60);
 }
}

createCanvas();

//验证输入的验证码与图中验证码时候相等
function captcha(e){
 if(e == value){
 return true;
 }
 else{
 return false;
 }
}

//点击提交按钮时的结果
function showResult(){
 var inputValue = $('.inputCaptcha').val();
 
 if(inputValue == '' ||inputValue == null || inputValue == 'undefined'){
 $('.errorText').css({display:'inline-block'}).html('验证码不能为空,请重新输入!');
 $('.captchaIcon').css({display:'inline-block',backgroundImage:"url('./images/false.png')"});
 }else{
 var flag = captcha(inputValue);
 if(!flag){
  $('.errorText').css({display:'inline-block'}).html('验证码错误,请重新输入!');
  $('.captchaIcon').css({display:'inline-block',backgroundImage:"url('./images/false.png')"});
 }else{
  $('.captchaIcon').css({display:'inline-block',backgroundImage:"url('./images/true.png')"});
 }
 }
}
$('.captchaSubmit').click(showResult);//提交
$('.refresh').click(createCanvas);//刷新
//点击input框
$('.inputCaptcha').focus(function(){
 $('.errorText').add($('.captchaIcon')).fadeOut(100);
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Aptana调试javascript图解教程
Nov 30 Javascript
javascript 防止刷新,后退,关闭
Aug 07 Javascript
基于jQuery的倒计时插件代码
May 07 Javascript
使用GruntJS构建Web程序之合并压缩篇
Jun 06 Javascript
js返回前一页刷新本页重载页面
Jul 29 Javascript
JavaScript中发布/订阅模式的简单实例
Nov 05 Javascript
详解JS函数重载
Dec 04 Javascript
thinkphp实现无限分类(使用递归)
Dec 19 Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
Nov 12 Javascript
JS实现图片上传预览功能
Nov 21 Javascript
bootstrap选项卡使用方法解析
Jan 11 Javascript
微信小程序如何实现精确的日期时间选择器
Jan 21 Javascript
微信小程序网络请求封装示例
Jul 24 #Javascript
js实现敏感词过滤算法及实现逻辑
Jul 24 #Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
Jul 24 #jQuery
jQuery实现菜单的显示和隐藏功能示例
Jul 24 #jQuery
Vue三种常用传值示例(父传子、子传父、非父子)
Jul 24 #Javascript
微信小程序实现横向增长表格的方法
Jul 24 #Javascript
vue中使用sessionStorage记住密码功能
Jul 24 #Javascript
You might like
用来给图片加水印的PHP类
2008/04/09 PHP
PHP 图片水印类代码
2012/08/27 PHP
php设置编码格式的方法
2013/03/05 PHP
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
2018/05/24 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
AngularJS基础知识
2014/12/21 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
ES6基础之展开语法(Spread syntax)
2019/02/21 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
2019/04/24 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
js 对象使用的小技巧实例分析
2019/11/08 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
python实现2048小游戏
2015/03/30 Python
python批量修改文件编码格式的方法
2018/05/31 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
Python使用lambda抛出异常实现方法解析
2020/08/20 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
用CSS3和table标签实现一个圆形轨迹的动画的示例代码
2019/01/17 HTML / CSS
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
远东集团网络工程师面试题
2014/10/20 面试题
绘画设计学生的个人自我评价
2013/09/20 职场文书
管理学专业个人求职信范文
2013/09/21 职场文书
网站美工岗位职责
2014/04/02 职场文书
合同协议书格式
2014/04/18 职场文书
初中生评语大全
2014/04/24 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript
javascript Number 与 Math对象的介绍
2021/11/17 Javascript