canvas绘制验证码图片

html
<div class="col-md-3 col-sm-3 col-xs-12 msg-code-box imgCode" id="code-img">
    <canvas id="canvas" width="100" height="38"></canvas>
    <span id="changeImg" class="glyphicon glyphicon-refresh" aria-hidden="true"></span>
</div>
调用方法
document.getElementById("changeImg").onclick = function(e){
    e.preventDefault();
    imgCodeObj.drawPic();
}
imgCodeObj.drawPic();


js

var imgCodeObj={
    imgCodeStr:'',
    /**生成一个随机数**/
    randomNum(min,max){
        return Math.floor( Math.random()*(max-min)+min);
    },
    /**生成一个随机色**/
    randomColor(min,max){
        var r = this.randomNum(min,max);
        var g = this.randomNum(min,max);
        var b = this.randomNum(min,max);
        return "rgb("+r+","+g+","+b+")";
    },
    /**绘制验证码图片**/
    drawPic(){
        this.imgCodeStr = '';
        var canvas=document.getElementById("canvas");
        var width=canvas.width;
        var height=canvas.height;
        var ctx = canvas.getContext('2d');
        ctx.textBaseline = 'bottom';

        /**绘制背景色**/
        ctx.fillStyle = this.randomColor(180,240); //颜色若太深可能导致看不清
        ctx.fillRect(0,0,width,height);
        /**绘制文字**/
        var str = 'ABCEFGHJKLMNPQRSTWXY123456789';
        for(var i=0; i<4; i++){
            var txt = str[this.randomNum(0,str.length)];
            ctx.fillStyle = this.randomColor(50,160);  //随机生成字体颜色
            ctx.font = this.randomNum(25,40)+'px SimHei'; //随机生成字体大小
            var x = 5+i*25;
            var y = this.randomNum(30,45);
            var deg = this.randomNum(-30, 30);
            //修改坐标原点和旋转角度
            ctx.translate(x,y);
            ctx.rotate(deg*Math.PI/180);
            ctx.fillText(txt, 0,0);
            //恢复坐标原点和旋转角度
            ctx.rotate(-deg*Math.PI/180);
            ctx.translate(-x,-y);
            this.imgCodeStr+=txt;
        }
        /**绘制干扰线**/
        for(var i=0; i<8; i++){
            ctx.strokeStyle = this.randomColor(100,180);
            ctx.beginPath();
            ctx.moveTo( this.randomNum(0,width), this.randomNum(0,height) );
            ctx.lineTo( this.randomNum(0,width), this.randomNum(0,height) );
            ctx.stroke();
        }
        /**绘制干扰点**/
        for(var i=0; i<100; i++){
            ctx.fillStyle = this.randomColor(0,255);
            ctx.beginPath();
            ctx.arc(this.randomNum(0,width),this.randomNum(0,height), 1, 0, 2*Math.PI);
            ctx.fill();
        }
    }
}

<think>嗯,用户想通过点击图片来刷新Canvas绘制验证码。我需要先理解他们的需求。用户可能已经用Canvas生成了验证码,但现在希望用户点击验证码图片时自动刷新,而不是用按钮。这样可以提升用户体验,让操作更直观。 首先,我得回忆一下之前的引用内容。引用1提到了用按钮触发刷新,而用户现在想改成点击图片。所以需要把事件绑定从按钮改为Canvas元素本身。原来的代码里,按钮的onclick调用了generateCaptcha()函数。现在需要把这个事件监听器移到Canvas上。 然后,怎么让Canvas元素响应点击事件呢?应该给Canvas添加一个点击事件监听,而不是按钮。比如用JavaScript获取Canvas元素,然后添加addEventListener('click', generateCaptcha)。这样当用户点击Canvas区域时,就会执行生成新验证码的函数。 接下来要考虑的是,如何确保点击图片部分才能刷新。不过一般来说,整个Canvas区域都可以绑定点击事件,所以用户点击任何位置都会触发刷新。可能需要确认用户是否希望点击特定区域,比如只有验证码图片部分,但通常整个Canvas都可以作为点击区域。 另外,生成验证码的函数可能需要调整。比如,在每次生成前清除Canvas内容,避免旧的验证码残留。可以使用clearRect方法清空画布,再重新绘制新的验证码。这点在引用3的代码里,有drawImage的部分,可能需要类似的操作。 然后,验证码的生成逻辑可能需要保持,比如随机字符、干扰线等。引用2提到了设置验证码长度,所以生成函数应该根据CODE_LENGTH生成相应位数的验证码,并绘制Canvas上。 还要注意事件绑定的时机。比如,在页面加载时生成初始验证码,并绑定点击事件。这可以在window的load事件里完成,如引用2中的代码示例。这样确保DOM元素已经加载完毕,可以正确获取Canvas元素。 最后,测试一下代码是否有效。当点击Canvas时,是否触发了generateCaptcha函数,是否正确清除了画布并生成了新的验证码。如果有问题,可能需要检查事件绑定是否正确,或者绘制函数是否有误。 总结一下步骤:1. 将按钮的点击事件改为Canvas的点击事件。2. 确保生成函数能正确清除并重新绘制验证码。3. 在页面加载时初始化事件绑定和首次生成。这样用户就能通过点击Canvas图片来刷新验证码了。</think>### 分步说明如何通过点击图片刷新Canvas验证码 #### 步骤1:绑定Canvas点击事件 移除按钮的`onclick`事件,改为监听Canvas自身的点击事件: ```javascript const canvas = document.getElementById('captchaCanvas'); canvas.addEventListener('click', generateCaptcha); // 点击画布触发刷新 ``` #### 步骤2:优化验证码生成函数 在生成新验证码前清空画布: ```javascript function generateCaptcha() { const ctx = canvas.getContext('2d'); ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空原有内容[^3] // 生成随机验证码文本(示例代码) const code = Math.random().toString(36).slice(2, 6).toUpperCase(); ctx.font = "30px Arial"; ctx.fillText(code, 50, 60); // 添加干扰线(增强安全性) for(let i=0; i<5; i++){ ctx.beginPath(); ctx.moveTo(Math.random()*200, Math.random()*100); ctx.lineTo(Math.random()*200, Math.random()*100); ctx.stroke(); } } ``` #### 步骤3:初始化页面加载 ```javascript window.addEventListener('load', () => { generateCaptcha(); // 初始生成验证码 canvas.style.cursor = 'pointer'; // 显示点击手势[^2] }); ``` #### 效果说明 用户点击验证码区域时: 1. 自动清除旧验证码(`clearRect`) 2. 生成新随机码+干扰线 3. 无刷新页面更新内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值