JS手写简易验证码

<!--给宿主元素设置宽高,否则采用默认宽高150*50-->
<div id="canvas" style="width:150px;height:50px;"></div>
 /*
 opt:{
      ele:【必填】宿主Dom的class(.className)或Id(#id)
      randomNum: 【可选】要随机出的字符数量
      randomChars: 【可选】要显示的验证码字符,优先级大于randomNum
      randomType: 【可选】参加随机的字符,0或其他:表示数字+字母,1:表示数字,2:表示字母
      randomAllChars: 【可选】自定义参加随机的字符,优先级大于randomType
      charsColor: 【可选】自定义随机的字符的颜色(CSS支持的颜色),是数组
      dotColor: 【可选】背景点的颜色(CSS支持的颜色),是数组
      charsStyle: 【可选】随机的字符的样式,fill:实心,stroke:空心,stroke:空心,fillStroke:实心+边框
      charsStrokeColor: 【可选】charsStyle为 fillStroke时,边框的颜色
      trigger:【可选】是否点击图片更新验证码
      bgUrl:【可选】背景图片
 }
 */
 function XyVerificationCode(opt) {
     var options = {
         ele: "", //宿主Dom的class(.className)或Id(#id)
         randomNum: 4, //要随机出的字符数量
         randomChars: [], //要显示的验证码字符,优先级大于randomNum
         randomType: "0", //参加随机的字符,0或其他:表示数字+字母,1:表示数字,2:表示字母
         randomAllChars: [], //自定义参加随机的字符,优先级大于randomType
         charsColor: [], //自定义随机的字符的颜色(CSS支持的颜色),可以是是数组也可是字符串
         dotColor: [], //背景点的颜色(CSS支持的颜色),是数组
         charsStyle: "fill", //随机的字符的样式,fill:实心,stroke:空心,fillStroke:实心+边框
         charsStrokeColor: "#000", //charsStyle为 fillStroke时,边框的颜色
         trigger: true, //是否点击图片更新验证码
         bgUrl: "" //背景图片
     };

     function assingObject(target, source) {
         for (var i in target) {
             target[i] = source[i] || target[i];
         }
     }
     if (Object.assign) {
         options = Object.assign(options, opt);
     } else {
         assingObject(options, opt);
     };

     this.options = options,
         this.resultArr = [],
         this.resultStr = "";
     //获取随机字符
     this.getRandomChar = function(num) {
             var numChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
             var letterChars = ['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'];
             var myChars = this.options.randomAllChars;
             if (myChars.length) {
                 letterChars = [];
                 numChars = [];
             } else if (this.options.randomType == "1") {
                 letterChars = [];
             } else if (this.options.randomType == "2") {
                 numChars = [];
             }

             var chars = [];
             chars = chars.concat(numChars).concat(letterChars).concat(myChars);

             var maxIndex = chars.length - 1;
             var randomArr = [],
                 randomIndex;
             for (var i = 0; i < num; i++) {
                 randomIndex = Math.ceil(Math.random() * maxIndex);
                 var c = chars[randomIndex].toUpperCase();
                 randomArr.push(c);
             }

             return randomArr;
         }
         //画背景+随机数
     this.drawIcode = function(elem, s_arr) {
             var d = document.querySelector(elem);
             var w = d.offsetWidth,
                 h = d.offsetHeight;
             if (!h||!w) {
                 w = 150, h = 50;
             }

             var len = s_arr.length;
             var per_w = w / len;
             var fontSize = h * 0.65;
             var x = 0,
                 y = h / 2;
             var restH = h - fontSize,
                 restW = per_w - fontSize;
             var randomYRange = ((restH - fontSize) / 2) * 0.3,
                 randomXRange = ((restW - fontSize) / 2) * 0.3;

             var canvasDom = document.createElement("canvas");
             if (this.options.trigger) {
                 var t = this;
                 canvasDom.onclick = function() {
                     t.draw.call(t);
                 }
             }
             var ctx = canvasDom.getContext('2d');
             canvasDom.id = "my-random-canvas";
             canvasDom.width = w + "";
             canvasDom.height = h + "";


             //画随机数
             var drawRandomChars = function(ctx) {
                     var r, g, b;
                     var cap = (per_w) / 2;
                     var rotateMaxValue = 30,
                         rotateValue;
                     var randomX, randomY
                     ctx.textAlign = "center";
                     ctx.textBaseline = "middle";
                     ctx.font = ctx.font.replace(/(\d+)/, fontSize + "");

                     var randomcharsColor = [];
                     if (this.options.charsColor instanceof Array) {
                         randomcharsColor = this.options.charsColor;
                     }
                     var randomcharsColorLen = randomcharsColor.length;
                     for (var i = 0; i < len; i++) {
                         ctx.save();
                         x += cap;
                         rotateValue = rotateMaxValue * Math.random();
                         rotateValue = Math.round(Math.random() * 1000) % 2 ? rotateValue : 0 - rotateValue;



                         randomX = Math.random() * randomXRange;
                         randomY = Math.random() * randomYRange;
                         randomX = Math.round(Math.random() * 1000) % 2 ? randomX : 0 - randomX;
                         randomY = Math.round(Math.random() * 1000) % 2 ? randomY : 0 - randomY;
                         ctx.translate(x + randomX, y + randomY);
                         ctx.rotate(rotateValue * Math.PI / 180);

                         if (randomcharsColorLen) {
                             ctx.fillStyle = randomcharsColor[i % randomcharsColorLen];
                             ctx.strokeStyle = randomcharsColor[i % randomcharsColorLen];
                         } else {
                             r = Math.round(Math.random() * 255);
                             g = Math.round(Math.random() * 255);
                             b = Math.round(Math.random() * 255);
                             ctx.fillStyle = "rgb(" + r + "," + g + "," + b + ")";
                             ctx.strokeStyle = "rgb(" + r + "," + g + "," + b + ")";
                         }
                         if (this.options.charsStyle == "stroke") {
                             ctx.strokeText(s_arr[i], 0, 0);
                         } else if (this.options.charsStyle == "fillstroke") {
                             ctx.fillText(s_arr[i], 0, 0);
                             ctx.strokeStyle = this.options.charsStrokeColor;
                             ctx.strokeText(s_arr[i], 0, 0);
                         } else {
                             ctx.fillText(s_arr[i], 0, 0);
                         }
                         x += cap;
                         ctx.restore();
                     }
                 }
                 //画背景
             var drawBg = function(ctx, w, h) {
                     ctx.save();
                     var numW = 60,
                         numH = 20,
                         perW = w / numW,
                         perH = h / numH;
                     randomR = (perW < perH ? perW : perH) * 1 / 2;
                     bgDotNum = 100;
                     var randomIndex, x, y, radius, startAngle, endAngle, anticlockwise;
                     var randomDotColor = [];
                     if (this.options.dotColor instanceof Array) {
                         randomDotColor = this.options.dotColor;
                     }
                     var randomDotColorLen = randomDotColor.length;
                     for (var i = 0; i < numW; i++) {
                         for (var j = 0; j < numH; j++) {
                             ctx.beginPath();
                             if (randomDotColorLen) {
                                 ctx.fillStyle = randomDotColor[(i * j + j) % randomDotColorLen];
                             } else {
                                 var r = Math.round(Math.random() * 255);
                                 var g = Math.round(Math.random() * 255);
                                 var b = Math.round(Math.random() * 255);
                                 ctx.fillStyle = "rgb(" + r + "," + g + "," + b + ")";
                             }

                             x = i * perW + perW / 2;
                             y = j * perH + perH / 2;
                             radius = randomR * Math.random();
                             startAngle = Math.PI / 180 * Math.random();
                             endAngle = Math.PI / 180 * Math.random();
                             anticlockwise = Math.random() > 0.5 ? true : false;
                             ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);
                             ctx.fill();
                         }

                     }
                     ctx.restore();
                     drawRandomChars.call(this, ctx);
                 }
                 //画背景(通过bgUrl传递)
             var drawBgImg = function(ctx, w, h) {
                 var t = this;
                 var url = this.options.bgUrl;
                 var imgDom = new Image();
                 imgDom.src = url;
                 // 判断是否有缓存
                 if (imgDom.complete) {
                     var dw = imgDom.width,
                         dh = imgDom.height;
                     ctx.drawImage(imgDom, 0, 0, dw, dh, 0, 0, w, h);
                     drawRandomChars.call(this, ctx);
                 } else {
                     // 加载完成执行
                     imgDom.onload = function() {
                         var dw = this.width,
                             dh = this.height;
                         ctx.drawImage(imgDom, 0, 0, dw, dh, 0, 0, w, h);
                         drawRandomChars.call(t, ctx);
                     }
                 }
             }


             if (this.options.bgUrl) {
                 drawBgImg.call(this, ctx, w, h)
             } else {
                 drawBg.call(this, ctx, w, h, per_w);
             }

             d.innerHTML = "";
             d.appendChild(canvasDom)
         }
         //init:获取随机数,画出完整的验证码
     this.draw = function() {
         if (this.options.randomChars.length) {
             this.resultArr = this.options.randomChars;
         } else {
             this.resultArr = this.getRandomChar(this.options.randomNum);
         }
         this.resultStr = this.resultArr.join(",");
         this.drawIcode(this.options.ele, this.resultArr);
         return this.resultArr;
     }
 }
 var v = new XyVerificationCode({
     ele: '#canvas'
 })
 var code = v.draw();
 console.log(code, v.resultArr, v.resultStr);

下班啦,思路明天补上

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值