CheckCode.js 前端验证码插件

简介: CheckCode.js 前端验证码插件

效果截图


20201230085659700.gif

插件使用方法


// 在html页面引入CheckCode.js
<script src="CheckCode.js"></script>
//定义
<script>
  let checkCode = new CheckCode({
    id:"code",      //容器的id值
        canvasId : "CheckCodeCanvas",    // canvas的id
        width:"100",        // canvas的宽度
        height:"30",       // canvas的高度
        type:"mix",     // 图形验证码默认类型mix:数字字母混合类型、number:纯数字、letter:纯字母
    });
    document.getElementById("button").onclick = function(){
        var res = checkCode .validate(document.getElementById("input").value);
        if(res){
            alert("验证正确");
        }else{
            alert("验证码错误");
        }
    }
</script>

CheckCode.js


/**
 * title -- 前端验证码插件一
 * author -- 三黄工作室
 * createTime -- 2020.12.28
 */
// 匿名函数 立即执行 避免冲突 提高性能
(function (window, document) {
    let N = 4; // 设置验证码长度
    function CheckCode(options){    //定义验证码类
        this.options = {
            id:"",      //容器的id值
            canvasId : "CheckCodeCanvas",    // canvas的id
            width:"100",        // canvas的default宽度
            height:"30",       // canvas的default高度
            type:"mix",         //图形验证码默认类型mix:数字字母混合类型、number:纯数字、letter:纯字母
            code:""
        }
        this.number = "1,2,3,4,5,6,7,8,9,0";
        this.letter = "q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m";
        // 初始化传入参数,判断参数类型,如果是object类型则依次赋值,否则赋给id
        this.initOptions = () => {
            if(Object.prototype.toString.call(options) == "[object Object]")
                for(let i in options)
                    this.options[i] = options[i];
            else
                this.options.id = options;
        }
        this.initOptions();
        this._init();
        this.create();
        this.style();
    }
    CheckCode.prototype = {
        title : "前端验证码插件一",
        author : "三黄工作室",
        createTime : "2020.12.28",
        styleJson:{
            font:[],
            x:[],
            y:[],
            deg:[],
            time:0
        },
        // 初始化验证码
        _init : function(){
            let con = document.getElementById(this.options.id);
            let 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.create();
            }
        },
        // 生成验证码
        create : function(){
            this.options.code = '';
            let txtArr='';
            switch(this.options.type){
                case 'mix': txtArr = (this.number+','+this.letter).split(",");break;
                case 'number': txtArr = this.number.split(",");break;
                case 'letter': txtArr = this.letter.split(",");break;
            }
            for(let i=1;i<=N;++i)
                this.options.code += txtArr[getRandomNum(0,txtArr.length-1)];
        },
        // 生成画布样式数据
        style : async function(){
            this.styleJson.time=0;
            this.styleJson.font=[];
            this.styleJson.x=[];
            this.styleJson.y=[];
            this.styleJson.deg=[];
            for(let i=1;i<=N;++i){
                this.styleJson.font.push(getRandomNum(this.options.height/2, this.options.height) + 'px SimHei');  // 字大小
                this.styleJson.x.push(this.options.width / (N+1) * i);
                this.styleJson.y.push(this.options.height /1.2);
                this.styleJson.deg.push(getRandomNum(-30, 30));
            }
            while(1){
                this.draw();
                await sleep(20);
            }
        },
        // 循环生成画布
        draw : function(){
            let canvas = document.getElementById(this.options.canvasId);
            let ctx = canvas.getContext('2d');
            ctx.clearRect(0, 0, this.options.width, this.options.height);   //  清除已有画布内容
            // 背景
            ctx.fillStyle = '#000';
            ctx.fillRect(0, 0, this.options.width, this.options.height);
            ctx.fillStyle = '#fff';
            ctx.fillRect(this.styleJson.time, 0, 20, this.options.height);
            if(this.styleJson.time>=this.options.width) this.styleJson.time=0;
            this.styleJson.time+=2;
            for(let i=0;i<N;++i){
                ctx.font = this.styleJson.font[i];
                ctx.fillStyle = '#000';
                ctx.shadowColor = "rgba(0, 0, 0, 0.4)";
                /**设置旋转角度和坐标原点**/
                ctx.translate(this.styleJson.x[i], this.styleJson.y[i]);
                ctx.rotate(this.styleJson.deg[i] * Math.PI / 180);
                ctx.fillText(this.options.code[i], 0, 0);
                /**恢复旋转角度和坐标原点**/
                ctx.rotate(-this.styleJson.deg[i] * Math.PI / 180);
                ctx.translate(-this.styleJson.x[i], -this.styleJson.y[i]);
            }
        },
        /**验证验证码**/
        validate: function(code){
            if(code == this.options.code){
                return true;
            }else{
                this.create();
                return false;
            }
        }
    }
    let getRandomColor = () => {
        return  '#' + (function(color){
             return (color +=  '0123456789abcdef'[Math.floor(Math.random()*16)])    
             && (color.length == 6) ?  color : arguments.callee(color);    
        })('');
     }
     /**生成一个随机数**/
    let getRandomNum = (min, max) =>{
        return Math.floor(Math.random() * (max - min) + min);
    }
    function sleep(ms){//时间延迟函数
        return new Promise(resolve =>setTimeout(resolve,ms))
    }
    // 导出CheckCode类
    window.CheckCode = CheckCode;
})(window, document)

本插件的参考示例


如果需要本插件的示例,请扫描关注我的公众号,回复“前端验证码”即可。

相关文章
|
3月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
10天前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
57 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
7天前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
25 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
2月前
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件
|
2月前
|
JavaScript 前端开发
基于SVG的js圆形菜单插件
这是一款基于SVG的js圆形菜单插件。该js圆形菜单插件可以生成漂亮的圆形菜单效果,支持二级菜单,支持使用鼠标滚动切换菜单
67 16
|
3月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
2月前
|
JavaScript
时尚简洁的js轮播图特效插件
这是一款时尚简洁的js轮播图特效插件。该轮播图采用es6语法制作,底部带缩略图和描述信息。图片和描述信息在切换时同步滑动。
|
2月前
|
JavaScript 前端开发 异构计算
兼容移动手机的js拖拽插件Draggin.js
兼容移动手机的js拖拽插件Draggin.js
62 1
|
3月前
|
Web App开发 JavaScript iOS开发
JS弹出式QQ在线客服插件
JS弹出式QQ在线客服插件
49 6
|
3月前
|
JavaScript 前端开发 容器
jQuery多功能滑块插件r-slider.js
r-slider.js是一款jQuery多功能滑块插件。使用该插件,可以制作出滑块、开关按钮、进度条、向导步骤等多种效果。
65 5

热门文章

最新文章

  • 1
    【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
  • 2
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 4
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 5
    详解智能编码在前端研发的创新应用
  • 6
    巧用通义灵码,提升前端研发效率
  • 7
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 8
    智能编码在前端研发的创新应用
  • 9
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 10
    抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目