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 容错处理代码, 屏蔽错误信息
Mar 09 Javascript
用javascript实现改变TEXTAREA滚动条和按钮的颜色,以及怎样让滚动条变得扁平
Apr 20 Javascript
pjblog中的UBBCode.js
Apr 25 Javascript
jquery keypress,keyup,onpropertychange键盘事件
Jun 25 Javascript
Node.js文件操作详解
Aug 16 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
Jan 28 Javascript
分享自己用JS做的扫雷小游戏
Feb 17 Javascript
JS仿百度自动下拉框模糊匹配提示
Jul 25 Javascript
Angular.js中用ng-repeat-start实现自定义显示
Oct 18 Javascript
vue中v-model的应用及使用详解
Jun 27 Javascript
JS实现放大镜效果
Sep 21 Javascript
Promise静态四兄弟实现示例详解
Jul 07 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
c#中的实现php中的preg_replace
2009/12/21 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
js常用函数 不错
2006/09/08 Javascript
JavaScript 代码压缩工具小结
2012/02/27 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
webpack优化之代码分割与公共代码提取详解
2019/11/22 Javascript
Python设计模式之观察者模式实例
2014/04/26 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
python executemany的使用及注意事项
2017/03/13 Python
Python实现加载及解析properties配置文件的方法
2018/03/29 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
python scrapy重复执行实现代码详解
2019/12/28 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
python绘制雷达图实例讲解
2021/01/03 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
市场营销毕业生自荐信范文
2014/04/01 职场文书
研发工程师岗位职责
2014/04/28 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
2015年路政工作总结
2015/05/22 职场文书
幼儿园春季开学通知
2015/07/16 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书
详解jQuery的核心函数和事件处理
2022/02/18 jQuery
python实现会员管理系统
2022/03/18 Python
python 离散点图画法的实现
2022/04/01 Python