使用gVerify.js實現(xiàn)簡單圖片驗證碼

先放實現(xiàn)后的截圖

圖片驗證碼

貼代碼

//使用方法
<script type="text/javascript">
        //初始化驗證碼
        var verifyCode = new GVerify({
            id:"picyzm",    //容器的ID
            type:"blend"    //圖形驗證碼的類型:blend-數(shù)字字母混合類型(默認)、number-純數(shù)字互躬、letter-純字母
        });

        //刷新驗證碼
        verifyCode.refresh();
        //校驗驗證碼
        verifyCode.validate('校驗的值');    //如果校驗正確返回ture愚争,校驗錯誤返回false

下面是個簡單的案例

//CSS 部分
<style type="text/css">
        body,html{
            width: 100%;
            text-align: center;
        }
        #picyzm{
            width: 100px;
            height: 40px;
            display: inline-block;
            margin: 0 30px;
        }
        #verifyCodeDemo{
            width: 100%;
            display: flex;
            margin-top: 200px;
            justify-content: center;
        }
        #btn{
            margin: 30px auto;
            background-color: blue;
            color: #fff;
            border-radius: 5px;
            border: 0;
            width: 100px;
            height: 40px;
        }
    </style>
//html
    <div id="verifyCodeDemo">
        <input type="text" id="code_input" placeholder="在這個框里輸入驗證碼">
        <p id="picyzm"></p>
    </div>
    <input type="button" value="驗證" id="btn">

//javascript
<script type="text/javascript">
        //初始化驗證碼
        var verifyCode = new GVerify({
            id:"picyzm", 
            type:"blend" 
        });
        //點擊按鈕驗證
        var code = document.getElementById("code_input");
        var btn =  document.getElementById("btn");
        btn.onclick = function(){
            var res = verifyCode.validate(code.value);
            if(res){
                console.log("驗證通過");
            }else{
                console.log("驗證碼錯誤");
            }
        }
        code_input.onblur = function(){
            var res = verifyCode.validate(code.value);
            if(res){
                console.log("驗證通過");
            }else{
                console.log("驗證碼錯誤");
            }
        }
    </script>

gVerify.js

!(function(window, document) {
    function GVerify(options) { //創(chuàng)建一個圖形驗證碼對象铺遂,接收options對象為參數(shù)
        this.options = { //默認options參數(shù)值
            id: "", //容器Id
            canvasId: "verifyCanvas", //canvas的ID
            width: "100", //默認canvas寬度
            height: "30", //默認canvas高度
            type: "blend", //圖形驗證碼默認類型blend:數(shù)字字母混合類型壁晒、number:純數(shù)字解藻、letter:純字母
            code: ""
        }
        
        if(Object.prototype.toString.call(options) == "[object Object]"){//判斷傳入?yún)?shù)類型
            for(var i in options) { //根據(jù)傳入的參數(shù)葫慎,修改默認參數(shù)值
                this.options[i] = options[i];
            }
        }else{
            this.options.id = options;
        }
        
        this.options.numArr = "0,1,2,3,4,5,6,7,8,9".split(",");
        this.options.letterArr = getAllLetter();

        this._init();
        this.refresh();
    }

    GVerify.prototype = {
        /**版本號**/
        version: '1.0.0',
        
        /**初始化方法**/
        _init: function() {
            var con = document.getElementById(this.options.id);
            var 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.refresh();
            }
        },
        
        /**生成驗證碼**/
        refresh: function() {
            this.options.code = "";
            var canvas = document.getElementById(this.options.canvasId);
            if(canvas.getContext) {
                var ctx = canvas.getContext('2d');
            }else{
                return;
            }
            
            ctx.textBaseline = "middle";

            ctx.fillStyle = randomColor(180, 240);
            ctx.fillRect(0, 0, this.options.width, this.options.height);

            if(this.options.type == "blend") { //判斷驗證碼類型
                var txtArr = this.options.numArr.concat(this.options.letterArr);
            } else if(this.options.type == "number") {
                var txtArr = this.options.numArr;
            } else {
                var txtArr = this.options.letterArr;
            }

            for(var i = 1; i <= 4; i++) {
                var txt = txtArr[randomNum(0, txtArr.length)];
                this.options.code += txt;
                ctx.font = randomNum(this.options.height/2, this.options.height) + 'px SimHei'; //隨機生成字體大小
                ctx.fillStyle = randomColor(50, 160); //隨機生成字體顏色
                ctx.shadowOffsetX = randomNum(-3, 3);
                ctx.shadowOffsetY = randomNum(-3, 3);
                ctx.shadowBlur = randomNum(-3, 3);
                ctx.shadowColor = "rgba(0, 0, 0, 0.3)";
                var x = this.options.width / 5 * i;
                var y = this.options.height / 2;
                var deg = 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);
            }
            /**繪制干擾線**/
            for(var i = 0; i < 4; i++) {
                ctx.strokeStyle = randomColor(40, 180);
                ctx.beginPath();
                ctx.moveTo(randomNum(0, this.options.width), randomNum(0, this.options.height));
                ctx.lineTo(randomNum(0, this.options.width), randomNum(0, this.options.height));
                ctx.stroke();
            }
            /**繪制干擾點**/
            for(var i = 0; i < this.options.width/4; i++) {
                ctx.fillStyle = randomColor(0, 255);
                ctx.beginPath();
                ctx.arc(randomNum(0, this.options.width), randomNum(0, this.options.height), 1, 0, 2 * Math.PI);
                ctx.fill();
            }
        },
        
        /**驗證驗證碼**/
        validate: function(code){
            var code = code.toLowerCase();
            var v_code = this.options.code.toLowerCase();
            if(code == v_code){
                return true;
            }else{
                return false;
            }
        }
    }
    /**生成字母數(shù)組**/
    function getAllLetter() {
        var letterStr = "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";
        return letterStr.split(",");
    }
    /**生成一個隨機數(shù)**/
    function randomNum(min, max) {
        return Math.floor(Math.random() * (max - min) + min);
    }
    /**生成一個隨機色**/
    function randomColor(min, max) {
        var r = randomNum(min, max);
        var g = randomNum(min, max);
        var b = randomNum(min, max);
        return "rgb(" + r + "," + g + "," + b + ")";
    }
    window.GVerify = GVerify;
})(window, document);
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胞谈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肖油,更是在濱河造成了極大的恐慌兼吓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件森枪,死亡現(xiàn)場離奇詭異视搏,居然都是意外死亡审孽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門浑娜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佑力,“玉大人,你說我怎么就攤上這事筋遭〈虿” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵宛畦,是天一觀的道長瘸洛。 經(jīng)常有香客問我,道長次和,這世上最難降的妖魔是什么反肋? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮踏施,結果婚禮上石蔗,老公的妹妹穿的比我還像新娘。我一直安慰自己畅形,他們只是感情好养距,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著日熬,像睡著了一般棍厌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竖席,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天浴骂,我揣著相機與錄音炫刷,去河邊找鬼捅膘。 笑死冕碟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的憎亚。 我是一名探鬼主播员寇,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼第美!你這毒婦竟也來了蝶锋?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斋日,失蹤者是張志新(化名)和其女友劉穎牲览,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恶守,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡第献,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兔港。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庸毫。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖衫樊,靈堂內(nèi)的尸體忽然破棺而出飒赃,到底是詐尸還是另有隱情,我是刑警寧澤科侈,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布载佳,位于F島的核電站,受9級特大地震影響臀栈,放射性物質(zhì)發(fā)生泄漏蔫慧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一权薯、第九天 我趴在偏房一處隱蔽的房頂上張望姑躲。 院中可真熱鬧,春花似錦盟蚣、人聲如沸黍析。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阐枣。三九已至,卻和暖如春奄抽,著一層夾襖步出監(jiān)牢的瞬間蔼两,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工如孝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宪哩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓第晰,卻偏偏與公主長得像锁孟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茁瘦,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 0. 寫在前面 當你開始工作時品抽,你不是在給你自己寫代碼,而是為后來人寫代碼甜熔。 —— Nichloas C. Zak...
    康斌閱讀 5,323評論 1 42
  • 今天早上遇見了一個有著超級純粹能量的小姑娘圆恤,那股能量在那一瞬間讓我由內(nèi)而外散發(fā)出一股喜悅,那一瞬間我被深深的吸引腔稀。...
    陽光撒在臉上閱讀 308評論 0 0
  • 主要人物: 徐厚根——男盆昙,28歲始羽历。最初為縣交警支隊大隊長,通過升遷成為市公安局長淡喜。因貪污落馬后試圖通過時空蟲洞拯...
  • 1G=1024MB 1MB=1024kb 1kb大約記錄了520個字 1048576個520(我愛你)
    七根閱讀 125評論 0 0