专栏首页梦魇小栈JAVASCRIPT生成图形验证码

JAVASCRIPT生成图形验证码

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

getGVerify: function(id) {
  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')
      }
      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 <= 4; i++) {
        var txt = txtArr[randomNum(0, txtArr.length)]
        this.options.code += txt
        ctx.font = '20px SimHei'
        //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 / 5) * 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 / 2),
          randomNum(0, this.options.height / 2)
        )
        ctx.lineTo(
          randomNum(0, this.options.width / 2),
          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 verifyCode = code.toLowerCase()
      var v_code = this.options.code.toLowerCase()
      if (verifyCode == v_code) {
        return true
      } else {
        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 + ')'
  }

  return new GVerify(id)
}

调用方法

var verifyCode = new GVerify(id)

验证方法

if (verifyCode.validate(inputCode)) {
  return true
} else {
  return false
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JQuery分析及实现part3之属性模块功能及实现

    ihoey
  • 重新介绍 JavaScript(JS全面系列教程)

    为什么会有这一篇“重新介绍”呢?因为 JavaScript 堪称世界上被人误解最深的编程语言。虽然常被嘲为“玩具语言”,但在它看似简洁的外衣下,还隐藏着强大的语...

    ihoey
  • Node第一部分-初体验

    在 windows 上安装 NodeJs (本教程中使用)。使用 MSI 文件,并按照提示安装 NodeJs ,默认情况下,安装程序将 NodeJs 发行到 C...

    ihoey
  • Openlayers离线加载天地图

    经过一个春节的休整,今天终于开始了!不论什么时候,都不要忘记学习,学习是一辈子的事情!今天,我来说说如何实现天地图的离线以及Openlayers加载离线数据实现...

    lzugis
  • 聊聊spring cloud的FeignLoadBalancer

    spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/open...

    codecraft
  • 聊聊spring cloud的FeignLoadBalancer

    spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/open...

    codecraft
  • Flutter第5天--布局实例+操作交互

    张风捷特烈
  • 【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--控制器的声明定义和发现篇(3/8)

    前面文章把路由已经介绍的差不多了,包括url映射,路由选择等。接下来讲一讲controller的一些基本规则

    旺财的城堡
  • canvas之clip使用 原

    裁切路径和普通的canvas图形差不多,不同的是它的作用是遮罩,用来隐藏路径以外的部分。 clip() 将当前正在构建的路径转换为当前的裁剪路径,默认情况下,...

    tianyawhl
  • 第166天:canvas绘制饼状图动画

    半指温柔乐

扫码关注云+社区

领取腾讯云代金券