原生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 相关文章推荐
Ext JS Grid在IE6 下宽度的问题解决方法
Feb 15 Javascript
JS 显示当前日期与时间的代码
Mar 24 Javascript
JavaScript开发规范要求(规范化代码)
Aug 16 Javascript
分享一个asp.net pager分页控件
Jan 04 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
Sep 21 Javascript
可以用鼠标拖动的DIV实现思路及代码
Oct 21 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
Dec 16 Javascript
javascript数据类型示例分享
Jan 19 Javascript
JS制作手机端自适应缩放显示
Jun 11 Javascript
JavaScript浏览器对象之一Window对象详解
Jun 03 Javascript
webpack热模块替换(HMR)/热更新的方法
Apr 05 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
Jun 27 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
重置版战役片段
2020/04/09 魔兽争霸
表单复选框向PHP传输数据的代码
2007/11/13 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
js版本A*寻路算法
2006/12/22 Javascript
jQuery 插件 将this下的div轮番显示
2009/04/09 Javascript
JQuery优缺点分析说明
2010/06/09 Javascript
使用原生javascript创建通用表单验证——更锋利的使用dom对象
2011/09/13 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
2016/08/11 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
python爬虫添加请求头代码实例
2019/12/28 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
党员教师批评与自我批评发言稿
2014/10/15 职场文书
赞美教师的句子
2019/09/02 职场文书