原生js生成图片验证码


Posted in Javascript onOctober 11, 2020

本文实例为大家分享了js生成图片验证码的具体代码,供大家参考,具体内容如下

html代码

<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <title>图形验证码</title>
 </head>
 <body>
  <div id="v_container" style="width: 200px;height: 50px;"></div>
  <input type="text" id="code_input" value="" placeholder="请输入验证码"/><button id="my_button">验证</button>
 </body>
 <script src="../js/picCode.js"></script>
 <script>
  var verifyCode = new GVerify("v_container");
  document.getElementById("my_button").onclick = function(){
   var res = verifyCode.validate(document.getElementById("code_input").value);
   if(res){
    alert("验证正确");
   }else{
    alert("验证码错误");
   }
  }
 </script>
</html>

js

!(function(window, document) {
 var size = 5;//设置验证码长度
 function GVerify(options) { //创建一个图形验证码对象,接收options对象为参数
  this.options = { //默认options参数值
   id: "", //容器Id
   canvasId: "verifyCanvas", //canvas的ID
   width: "100", //默认canvas宽度
   height: "30", //默认canvas高度
   type: "blend", //图形验证码默认类型blend:数字字母混合类型、number:纯数字、letter:纯字母
   code: "",
  }
  if(Object.prototype.toString.call(options) == "[object Object]"){//判断传入参数类型
   for(var i in options) { //根据传入的参数,修改默认参数值
    this.options[i] = options[i];
   }
  }else{
   this.options.id = options;
  }
  
  this.options.numArr = "0,1,2,3,4,5,6,7,8,9".split(",");
  this.options.letterArr = getAllLetter();
 
  this._init();
  this.refresh();
 }
 
 GVerify.prototype = {
  /**版本号**/
  version: '1.0.0',
  
  /**初始化方法**/
  _init: function() {
   var con = document.getElementById(this.options.id);
   var canvas = document.createElement("canvas");
   this.options.width = con.offsetWidth > 0 ? con.offsetWidth : "100";
   this.options.height = con.offsetHeight > 0 ? con.offsetHeight : "30";
   canvas.id = this.options.canvasId;
   canvas.width = this.options.width;
   canvas.height = this.options.height;
   canvas.style.cursor = "pointer";
   canvas.innerHTML = "您的浏览器版本不支持canvas";
   con.appendChild(canvas);
   var parent = this;
   canvas.onclick = function(){
    parent.refresh();
   }
  },
  
  /**生成验证码**/
  refresh: function() {
   this.options.code = "";
   var canvas = document.getElementById(this.options.canvasId);
   if(canvas.getContext) {
    var ctx = canvas.getContext('2d');
   }else{
    return;
   }
   
   ctx.textBaseline = "middle";
 
   ctx.fillStyle = randomColor(180, 240);
   ctx.fillRect(0, 0, this.options.width, this.options.height);
 
   if(this.options.type == "blend") { //判断验证码类型
    var txtArr = this.options.numArr.concat(this.options.letterArr);
   } else if(this.options.type == "number") {
    var txtArr = this.options.numArr;
   } else {
    var txtArr = this.options.letterArr;
   }
 
   for(var i = 1; i <=size; i++) {
    var txt = txtArr[randomNum(0, txtArr.length)];
    this.options.code += txt;
    ctx.font = randomNum(this.options.height/2, this.options.height) + 'px SimHei'; //随机生成字体大小
    ctx.fillStyle = randomColor(50, 160); //随机生成字体颜色  
    ctx.shadowOffsetX = randomNum(-3, 3);
    ctx.shadowOffsetY = randomNum(-3, 3);
    ctx.shadowBlur = randomNum(-3, 3);
    ctx.shadowColor = "rgba(0, 0, 0, 0.3)";
    var x = this.options.width / (size+1) * i;
    var y = this.options.height / 2;
    var deg = randomNum(-30, 30);
    /**设置旋转角度和坐标原点**/
    ctx.translate(x, y);
    ctx.rotate(deg * Math.PI / 180);
    ctx.fillText(txt, 0, 0);
    /**恢复旋转角度和坐标原点**/
    ctx.rotate(-deg * Math.PI / 180);
    ctx.translate(-x, -y);
   }
   /**绘制干扰线**/
   for(var i = 0; i < 4; i++) {
    ctx.strokeStyle = randomColor(40, 180);
    ctx.beginPath();
    ctx.moveTo(randomNum(0, this.options.width), randomNum(0, this.options.height));
    ctx.lineTo(randomNum(0, this.options.width), randomNum(0, this.options.height));
    ctx.stroke();
   }
   /**绘制干扰点**/
   for(var i = 0; i < this.options.width/4; i++) {
    ctx.fillStyle = randomColor(0, 255);
    ctx.beginPath();
    ctx.arc(randomNum(0, this.options.width), randomNum(0, this.options.height), 1, 0, 2 * Math.PI);
    ctx.fill();
   }
  },
  
  /**验证验证码**/
  validate: function(code){
   var code = code.toLowerCase();
   var v_code = this.options.code.toLowerCase();
   if(code == v_code){
    return true;
   }else{
    this.refresh();
    return false;
   }
  }
 }
 /**生成字母数组**/
 function getAllLetter() {
  var letterStr = "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";
  return letterStr.split(",");
 }
 /**生成一个随机数**/
 function randomNum(min, max) {
  return Math.floor(Math.random() * (max - min) + min);
 }
 /**生成一个随机色**/
 function randomColor(min, max) {
  var r = randomNum(min, max);
  var g = randomNum(min, max);
  var b = randomNum(min, max);
  return "rgb(" + r + "," + g + "," + b + ")";
 }
 window.GVerify = GVerify;
})(window, document);

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

Javascript 相关文章推荐
对YUI扩展的Gird组件 Part-2
Mar 10 Javascript
关于JavaScript定义类和对象的几种方式
Nov 09 Javascript
js判读浏览器是否支持html5的canvas的代码
Nov 18 Javascript
加载列表时jquery获取ul中第一个li的属性
Nov 02 Javascript
jQuery选择器之基本选择器与层次选择器
Mar 03 Javascript
判断数组的最佳方法(推荐)
Oct 11 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
Dec 23 Javascript
浅析JS中常用类型转换及运算符表达式
Jul 23 Javascript
使用Dropzone.js上传的示例代码
Oct 10 Javascript
Laravel admin实现消息提醒、播放音频功能
Jul 10 Javascript
JS图片预加载三种实现方法解析
May 08 Javascript
ES6函数实现排它两种写法解析
May 13 Javascript
js实现石头剪刀布游戏
Oct 11 #Javascript
js+h5 canvas实现图片验证码
Oct 11 #Javascript
vue2和vue3的v-if与v-for优先级对比学习
Oct 10 #Javascript
如何手写简易的 Vue Router
Oct 10 #Javascript
如何手写一个简易的 Vuex
Oct 10 #Javascript
echarts实现晶体球面投影的实例教程
Oct 10 #Javascript
详解Vue中Axios封装API接口的思路及方法
Oct 10 #Javascript
You might like
用PHP动态创建Flash动画
2006/10/09 PHP
一个数据采集类
2007/02/14 PHP
php 获取百度的热词数据的代码
2012/02/18 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
用JS控制回车事件的代码
2011/02/20 Javascript
完美解决IE低版本不支持call与apply的问题
2013/12/05 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
微信小程序 label 组件详解及简单实例
2017/01/10 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
Vue中的字符串模板的使用
2018/05/17 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
5个你不知道的JavaScript字符串处理库(小结)
2020/06/01 Javascript
Python的IDEL增加清屏功能实例
2017/06/19 Python
python学习基础之循环import及import过程
2018/04/22 Python
pandas值替换方法
2018/07/10 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
学Python 3的理由和必要性
2019/11/19 Python
Python获取指定网段正在使用的IP
2020/12/14 Python
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
营销与策划个人求职信
2013/09/22 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
安全教育感言
2014/03/04 职场文书
写自荐信的注意事项
2014/03/09 职场文书
信用社主任竞聘演讲稿
2014/05/23 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
施工员岗位职责
2015/02/10 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL