JavaScript实现页面动态验证码的实现示例

现在很多在用户登陆或注册的时候为了防止程序攻击,加入了动态验证的技术,一般是让用户输入随即生成的验证码来实现。我自己写了一个没有跟后台交互的,就在前端验证,发出来给大家看看。

Posted in Javascript onMarch 23, 2021

效果图:

JavaScript实现页面动态验证码的实现示例

 实现思路:

  • 把数字和字母放到一个数组中,通过随机的方式取得数组下标,总共取4个组成验证码;
  • 把验证码渲染出来(一个一个的渲染);
  • 绘制一定数量的干扰线,随机颜色;
  • 输入验证码,输入4位以后去验证,正确显示钩,错误显示叉并且刷新验证码。

编写构造函数

文本构造函数

//文字的构造函数
    function Text(o){
        this.x=0,//x坐标
        this.y=0,//y坐标
        this.text='',//内容
        this.font=null;//字体
        this.textAlign=null;//对齐方式
         
        this.init(o);
    }
     
    Text.prototype.init=function(o){
        for(var key in o){
            this[key]=o[key];
        }
    }
    Text.prototype.render=function(context){
        this.ctx=context;
        innerRender(this);
             
        function innerRender(obj){
            var ctx=obj.ctx;
            ctx.save()
            ctx.beginPath();
            ctx.translate(obj.x,obj.y);
             
            if(obj.font){
                ctx.font=obj.font;
            }
            if(obj.textAlign){
                ctx.textAlign=obj.textAlign;
            }
            if(obj.fill){//是否填充
                obj.fillStyle?(ctx.fillStyle=obj.fillStyle):null;
                ctx.fillText(obj.text,0,0);
            }
            ctx.restore();
        }
        return this;
    }

线段构造函数

//直线的构造
function Line(ctx,o){
    this.x=0,//x坐标
    this.y=0,//y坐标
    this.startX=0,//开始点x位置
    this.startY=0, //开始点y位置
    this.endX=0,//结束点x位置
    this.endY=0;//结束点y位置
    this.thin=false;//设置变细系数
    this.ctx=ctx;
     
    this.init(o);
}
Line.prototype.init=function(o){
    for(var key in o){
        this[key]=o[key];
    }
}
Line.prototype.render=function(){
    innerRender(this);
     
    function innerRender(obj){
        var ctx=obj.ctx;
        ctx.save()
        ctx.beginPath();
        ctx.translate(obj.x,obj.y);
        if(obj.thin){
            ctx.translate(0.5,0.5);
        }
        if(obj.lineWidth){//设定线宽
            ctx.lineWidth=obj.lineWidth;
        }
        if(obj.strokeStyle){
            ctx.strokeStyle=obj.strokeStyle;
        }
        //划线
        ctx.moveTo(obj.startX, obj.startY);
        ctx.lineTo(obj.endX, obj.endY);
        ctx.stroke();
        ctx.restore();
    }
     
    return this;
}

按长度获取验证码

//根据指定长度生成随机字母数字
Verifiable.prototype.randomWord=function(range){
 var str = "",pos,
   arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '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'];
 for(var i=0; i<range; i++){
  pos = Math.round(Math.random() * (arr.length-1));
  str += arr[pos];
 }
 return str;
}

绘制文字

//绘制文字
Verifiable.prototype.drawText=function(){
    var that=this;
    var count = 4;//文字个数
    var textW = 40;//文字所占宽
    var code=this.code = this.randomWord(count);
    var codeArr = code.split("");
    var text,x ;
    codeArr.forEach(function(c,i){
        x = that.w/count*i+textW/2;
        //绘制文字
        text = new Text({
            x:x,
            y:textW-10,
            text:c,
            font:'30px ans-serif',
            textAlign:'center',
            fill:true,
            fillStyle:'#412D6A'
        });
        that.renderArr.push(text);
    })      
}

此时效果:

JavaScript实现页面动态验证码的实现示例

绘制干扰线

//绘制干扰线
    Verifiable.prototype.interfering=function(){
        var count = this.lineCount=20,line,ctx=this.ctx;
        var startX,
            startY,
            endX,
            endY,
            color;
             
        for(var i=0;i<count;i++){
            //随机开始坐标,结束坐标、颜色
            startX = _.getRandom(0,140);
            startY = _.getRandom(0,40);
            endX = _.getRandom(0,140);
            endY = _.getRandom(0,40);
            color = _.getRandomColor();
            //定义一条直线
            line = new Line(ctx,{
                x:0,
                y:0,
                startX:startX,
                startY:startY,
                endX:endX,
                endY:endY,
                strokeStyle:color
            })
             
            this.renderArr.push(line);
        }
    }

此时效果如下:

JavaScript实现页面动态验证码的实现示例

加入页面布局

<!DOCTYPE html>
<html lang="zh">
  
<head>
  <meta charset="UTF-8">
  <title>verifiable</title>
  <style>
   #box{
        width:140px;
        height:40px;
        position:absolute;
         
    }
    #inputDiv{
        width:220px;
        position:absolute;
        margin:0 auto;
        left:0;
        top:30px;
        right:0;
        bottom:0;
    }
    #container{
        width:220px;
        height:60px;
        position:absolute;
        margin:0 auto;
        left:0;
        top:60px;
        right:0;
        bottom:0;
    }
    .refresh{
        position:absolute;
        left:140px;
    }
  </style>
</head>
  
<body>
    <div id='inputDiv'>
    验证码:<input size=10 id='codeInput'><img id='stateImg' style="vertical-align: middle;width:20px"></img>
  </div>
  <div id="container">
    <div id='box'></div>
    <a href="javascript:void 0" class="refresh" onclick="refresh()">换一张</a>
  </div>
</body>
    <script type="text/javascript" src='verifiable.js'></script>
  <script type="text/javascript">
    var box = document.getElementById('box');
    var stateImg = document.getElementById('stateImg');
    var codeInput = document.getElementById('codeInput');
     
    verifiable.init(box,codeInput,stateImg);
     
    //换一张
    function refresh(){
        verifiable.renderArr.length=0;
        verifiable.draw();
    }
  </script>
</html>

加入输入框事件

//输入框事件
Verifiable.prototype.inputValid=function(input){
    var val = input.value;
    if(val.length<4) return ;
     
    if(this.code==val){
        console.log('suc');
        this.result(0);
    }else{
        this.result(1);
    }
}

加入成功、失败验证

//处理结果
    Verifiable.prototype.result=function(result){
        var codeInput = this.codeInput;
        var stateImg = this.stateImg;
        if(result==0){//成功
            stateImg.src="./images/suc.jpeg";
            codeInput.readOnly=true;
        }else {//失败
            codeInput.readOnly=false;
            stateImg.src="./images/fail.jpeg";
            this.renderArr.length=0;
            this.draw();
        }
    }

完成

JavaScript实现页面动态验证码的实现示例

 

 

Javascript 相关文章推荐
基于jQuery实现的水平和垂直居中的div窗口
Aug 08 Javascript
js通过地址栏给action传值(中文乱码全是问号)
May 02 Javascript
asp.net+js实现金额格式化
Feb 27 Javascript
JavaScript动态修改网页元素内容的方法
Mar 21 Javascript
jquery实现简单手风琴菜单效果实例
Jun 13 Javascript
Javascript 调用 ActionScript 的简单方法
Sep 22 Javascript
node.js平台下的mysql数据库配置及连接
Mar 31 Javascript
vue中echarts3.0自适应的方法
Feb 26 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
May 21 jQuery
微信小程序实现页面浮动导航
Jan 08 Javascript
JavaScript字符和ASCII实现互相转换
Jun 03 Javascript
JavaScript中的宏任务和微任务详情
Nov 27 Javascript
使用Vue.js和MJML创建响应式电子邮件
JS原生实现轮播图的几种方法
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
vue+flask实现视频合成功能(拖拽上传)
Mar 04 #Vue.js
React服务端渲染原理解析与实践
Mar 04 #Javascript
vue打开新窗口并实现传参的图文实例
Mar 04 #Vue.js
Vue-router编程式导航的两种实现代码
Mar 04 #Vue.js
You might like
新浪新闻小偷
2006/10/09 PHP
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
Laravel框架数据库迁移操作实例详解
2020/04/06 PHP
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
JS版元素周期表实现方法
2015/08/05 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
解析Vue2.0双向绑定实现原理
2017/02/23 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
微信分享invalid signature签名错误踩过的坑
2020/04/11 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
swiper自定义分页器的样式
2020/09/14 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python动态加载模块的3种方法
2014/11/22 Python
python循环监控远程端口的方法
2015/03/14 Python
Python实现优先级队列结构的方法详解
2016/06/02 Python
Django基础之Model操作步骤(介绍)
2017/05/27 Python
python安装scipy的步骤解析
2019/09/28 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
广州地球村科技数据库题目
2016/04/25 面试题
中专生职业生涯规划书范文
2014/01/10 职场文书
关于中国梦的演讲稿
2014/04/23 职场文书
经典导游欢迎词
2015/01/26 职场文书