成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Canvas入門實(shí)戰(zhàn)之怎么實(shí)現(xiàn)一個(gè)圖形驗(yàn)證碼

這篇文章主要介紹“Canvas入門實(shí)戰(zhàn)之怎么實(shí)現(xiàn)一個(gè)圖形驗(yàn)證碼”,在日常操作中,相信很多人在Canvas入門實(shí)戰(zhàn)之怎么實(shí)現(xiàn)一個(gè)圖形驗(yàn)證碼問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Canvas入門實(shí)戰(zhàn)之怎么實(shí)現(xiàn)一個(gè)圖形驗(yàn)證碼”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧! 

公司主營業(yè)務(wù):成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出民和免費(fèi)做網(wǎng)站回饋大家。

你將收獲

  • 閉包的使用

  • canvas常用api的使用

  • javascript面向?qū)ο蟮膶?shí)現(xiàn)方式

  • 實(shí)現(xiàn)一個(gè)canvas的圖形驗(yàn)證碼的一般思路和常用算法

設(shè)計(jì)思路

  1. 用canvas生成畫布

  2. 用canvas畫干擾線或躁點(diǎn)

  3. 生成隨機(jī)不重復(fù)的n的字母

  4. 用canvas繪制文字

  5. 初始化和canvas點(diǎn)擊事件

  6. 組件化封裝

文末將附上組件封裝的源碼,歡迎大家隨時(shí)溝通交流。關(guān)于項(xiàng)目的打包,我將使用自己基于gulp4搭建的9012教你如何使用gulp4開發(fā)項(xiàng)目腳手架。

效果預(yù)覽

Canvas入門實(shí)戰(zhàn)之怎么實(shí)現(xiàn)一個(gè)圖形驗(yàn)證碼

實(shí)現(xiàn)思路

我將按照上文中的設(shè)計(jì)思路的步驟一步步實(shí)現(xiàn),首先我們先定義一個(gè)es5類:

function Gcode(el, option) {     this.el = typeof el === 'string' ? document.querySelector(el) : el;     this.option = option;     this.init(); }

其中init是用來初始化用的,參數(shù)el代表需要掛載的元素或元素id,option為傳入的可選項(xiàng),稍后會(huì)在代碼中體現(xiàn),通常這也是面向?qū)ο蟮某S锰茁贰?/p>

1.繪制畫布

Gcode.prototype = {     constructor: Gcode,     init: function() {         if(this.el.getContext) {             isSupportCanvas = true;             var ctx = this.el.getContext('2d'),             // 設(shè)置畫布寬高             cw = this.el.width = this.option.width || 200,             ch = this.el.height = this.option.height || 40;         }     } }

這里我們在初始化方法中先定義一個(gè)canvas畫布,寬高為用戶自定義的寬高,默認(rèn)為200*40。

2.繪制干擾線

// 畫干擾線 drawLine: function(ctx, lineNum, maxW, maxH) {     ctx.clearRect(0, 0, maxW, maxH);     for(var i=0; i < lineNum; i++) {         var dx1 = Math.random()* maxW,             dy1 = Math.random()* maxH,             dx2 = Math.random()* maxW,             dy2 = Math.random()* maxH;         ctx.strokeStyle = 'rgb(' + 255*Math.random() + ',' + 255*Math.random() + ',' + 255*Math.random() + ')';         ctx.beginPath();         ctx.moveTo(dx1, dy1);         ctx.lineTo(dx2, dy2);         ctx.stroke();     } }

這里我們對類Gcode定義原型方法drawLine,然后通過for循環(huán)繪制隨機(jī)位置的線條,為了讓canvas每次點(diǎn)擊能清空之前的干擾線,我們使用clearRect來清除畫布。

3.生成隨機(jī)不重復(fù)的n個(gè)字符

我們通過遞歸實(shí)現(xiàn),如下==:

// 生成唯一文字 generateUniqueText: function(source, hasList, limit) {     var text = source[Math.floor(Math.random()*limit)];     if(hasList.indexOf(text) > -1) {         return this.generateUniqueText(source, hasList, limit)     }else {         return text     }   } // 生成指定個(gè)數(shù)的隨機(jī)文字 randomText: function(len) {     var source = ['a', 'b', 'c', 'd', 'e',     'f', 'g', 'h', 'i', 'j',      'k', 'l', 'm', 'o', 'p',     'q', 'r', 's', 't', 'u',     'v', 'w', 'x', 'y', 'z'];     var result = [];     var sourceLen = source.length;     for(var i=0; i< len; i++) {         var text = this.generateUniqueText(source, result, sourceLen);         result.push(text)     }     return result.join('') }

我們通過定義一個(gè)字母表,傳入生成的隨機(jī)字母的個(gè)數(shù),配合generateUniqueText來實(shí)現(xiàn)生成唯一不重復(fù)的n個(gè)隨機(jī)字符。當(dāng)然筆者認(rèn)為這個(gè)方法并不優(yōu)雅,你也可以使用uuid的方式或者更好的方式,歡迎隨時(shí)和筆者交流。

4.用canvas繪制文字

// 畫文字 drawText: function(ctx, text, maxH) {     var len = text.length;     for(var i=0; i < len; i++) {         var dx = 30 * Math.random() + 30* i,             dy = Math.random()* 5 + maxH/2;         ctx.fillStyle = 'rgb(' + 255*Math.random() + ',' + 255*Math.random() + ',' + 255*Math.random() + ')';         ctx.font = '30px Helvetica';         ctx.textBaseline = 'middle';         ctx.fillText(text[i], dx, dy);     } },

這里和上文畫線實(shí)現(xiàn)類似。就不做過多介紹了。

5.初始化和canvas點(diǎn)擊事件

接下來我們看看完整的初始化代碼:

init: function() {     if(this.el.getContext) {         isSupportCanvas = true;         var ctx = this.el.getContext('2d'),         // 設(shè)置畫布寬高         cw = this.el.width = this.option.width || 200,         ch = this.el.height = this.option.height || 40,         textLen = this.option.textLen || 4,         lineNum = this.option.lineNum || 4;         var text = this.randomText(textLen);          this.onClick(ctx, textLen, lineNum, cw, ch);         this.drawLine(ctx, lineNum, cw, ch);         this.drawText(ctx, text, ch);     } }

點(diǎn)擊事件主要是為了用戶點(diǎn)擊可以切換驗(yàn)證碼:

onClick: function(ctx, textLen, lineNum, cw, ch) {     var _ = this;     this.el.addEventListener('click', function(){         text = _.randomText(textLen);         _.drawLine(ctx, lineNum, cw, ch);         _.drawText(ctx, text, ch);     }, false) }

到此,一個(gè)完整的驗(yàn)證碼組件實(shí)現(xiàn)完成,怎么用呢?如下:

new Gcode('#canvas_code', {         lineNum: 6,  // 可選         textLen: 4,  // 可選         width: 200,  // 可選         height: 50   // 可選     })

完整代碼如下,歡迎學(xué)習(xí)交流:

// canvas繪制圖形驗(yàn)證碼     (function(){         function Gcode(el, option) {             this.el = typeof el === 'string' ? document.querySelector(el) : el;             this.option = option;             this.init();         }         Gcode.prototype = {             constructor: Gcode,             init: function() {                 if(this.el.getContext) {                     isSupportCanvas = true;                     var ctx = this.el.getContext('2d'),                     // 設(shè)置畫布寬高                     cw = this.el.width = this.option.width || 200,                     ch = this.el.height = this.option.height || 40,                     textLen = this.option.textLen || 4,                     lineNum = this.option.lineNum || 4;                     var text = this.randomText(textLen);                              this.onClick(ctx, textLen, lineNum, cw, ch);                     this.drawLine(ctx, lineNum, cw, ch);                     this.drawText(ctx, text, ch);                 }             },             onClick: function(ctx, textLen, lineNum, cw, ch) {                 var _ = this;                 this.el.addEventListener('click', function(){                     text = _.randomText(textLen);                     _.drawLine(ctx, lineNum, cw, ch);                     _.drawText(ctx, text, ch);                 }, false)             },             // 畫干擾線             drawLine: function(ctx, lineNum, maxW, maxH) {                 ctx.clearRect(0, 0, maxW, maxH);                 for(var i=0; i < lineNum; i++) {                     var dx1 = Math.random()* maxW,                         dy1 = Math.random()* maxH,                         dx2 = Math.random()* maxW,                         dy2 = Math.random()* maxH;                     ctx.strokeStyle = 'rgb(' + 255*Math.random() + ',' + 255*Math.random() + ',' + 255*Math.random() + ')';                     ctx.beginPath();                     ctx.moveTo(dx1, dy1);                     ctx.lineTo(dx2, dy2);                     ctx.stroke();                 }             },             // 畫文字             drawText: function(ctx, text, maxH) {                 var len = text.length;                 for(var i=0; i < len; i++) {                     var dx = 30 * Math.random() + 30* i,                         dy = Math.random()* 5 + maxH/2;                     ctx.fillStyle = 'rgb(' + 255*Math.random() + ',' + 255*Math.random() + ',' + 255*Math.random() + ')';                     ctx.font = '30px Helvetica';                     ctx.textBaseline = 'middle';                     ctx.fillText(text[i], dx, dy);                 }             },             // 生成指定個(gè)數(shù)的隨機(jī)文字             randomText: function(len) {                 var source = ['a', 'b', 'c', 'd', 'e',                 'f', 'g', 'h', 'i', 'j',                  'k', 'l', 'm', 'o', 'p',                 'q', 'r', 's', 't', 'u',                 'v', 'w', 'x', 'y', 'z'];                 var result = [];                 var sourceLen = source.length;                 for(var i=0; i< len; i++) {                     var text = this.generateUniqueText(source, result, sourceLen);                     result.push(text)                 }                 return result.join('')             },             // 生成唯一文字             generateUniqueText: function(source, hasList, limit) {                 var text = source[Math.floor(Math.random()*limit)];                 if(hasList.indexOf(text) > -1) {                     return this.generateUniqueText(source, hasList, limit)                 }else {                     return text                 }               }         }         new Gcode('#canvas_code', {             lineNum: 6         })     })();

到此,關(guān)于“Canvas入門實(shí)戰(zhàn)之怎么實(shí)現(xiàn)一個(gè)圖形驗(yàn)證碼”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

網(wǎng)頁名稱:Canvas入門實(shí)戰(zhàn)之怎么實(shí)現(xiàn)一個(gè)圖形驗(yàn)證碼
本文來源:http://jinyejixie.com/article42/jpcdhc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT面包屑導(dǎo)航、品牌網(wǎng)站建設(shè)、全網(wǎng)營銷推廣靜態(tài)網(wǎng)站、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
乐业县| 都匀市| 安塞县| 夏河县| 九龙坡区| 醴陵市| 财经| 周宁县| 砚山县| 达拉特旗| 永嘉县| 邻水| 城步| 和静县| 绿春县| 久治县| 富顺县| 茶陵县| 靖宇县| 黄浦区| 卓资县| 福海县| 常德市| 沁源县| 花垣县| 依安县| 绥德县| 营口市| 菏泽市| 游戏| 扎兰屯市| 天津市| 宜丰县| 城口县| 尖扎县| 娱乐| 诏安县| 常宁市| 海南省| 寻甸| 扬州市|