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 相关文章推荐
js下弹出窗口的变通
Apr 18 Javascript
Javascript动态创建div的方法
Feb 09 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
Nov 04 Javascript
javascript Slip.js实现整屏滑动的手机网页
Nov 25 Javascript
jQuery中Find选择器用法示例
Sep 21 Javascript
Javascript 实现简单计算器实例代码
Oct 23 Javascript
Vue.js实现简单ToDoList 前期准备(一)
Dec 01 Javascript
Angular动态添加、删除输入框并计算值实例代码
Mar 29 Javascript
使用webpack打包后的vue项目如何正确运行(express)
Oct 26 Javascript
详解jQuery中的getAll()和cleanData()
Apr 15 jQuery
vue2.0基于vue-cli+element-ui制作树形treeTable
Apr 30 Javascript
JavaScript实现HSL拾色器
May 21 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
Thinkphp+smarty+uploadify实现无刷新上传
2015/07/30 PHP
PHP编写的图片验证码类文件分享
2016/06/06 PHP
jQuery+php简单实现全选删除的方法
2016/11/28 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
浅谈javascript中关于日期和时间的基础知识
2016/07/13 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
Python 字符串换行的多种方式
2018/09/06 Python
Django ModelForm操作及验证方式
2020/03/30 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
类成员函数的重载、覆盖和隐藏区别
2016/01/27 面试题
使用索引有什么好处
2016/07/27 面试题
计算机专业大学生的自我评价
2013/11/14 职场文书
副厂长岗位职责
2014/02/02 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
2014年外联部工作总结
2014/11/17 职场文书
店面出租协议书范本
2014/11/28 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
高中物理教学反思
2016/02/19 职场文书
Java Dubbo框架知识点梳理
2021/06/26 Java/Android
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python
zabbix配置nginx监控的实现
2022/05/25 Servers
React自定义hook的方法
2022/06/25 Javascript