亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

html+jQuery實現拖動滑塊圖片拼圖驗證碼插件【移動端適用】

2019-11-19 10:50:29
字體:
來源:轉載
供稿:網友

電腦和手機移動端都適用的jQuery拖動滑塊圖片拼圖驗證碼插件,通過鼠標拖動或觸屏滑動填充拼圖來進行安全驗證,點擊刷新可以更換當前待驗證的圖片。

HTML & css:

<!DOCTYPE html><html lang="zh"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>拖動滑塊圖片拼圖驗證碼插件</title><!--框架樣式--><link href="css/bootstrap.min.css" rel="external nofollow" rel="stylesheet"><!--圖標樣式--><link  rel="stylesheet"><!--主要樣式--><link href="disk/slidercaptcha.css" rel="external nofollow" rel="stylesheet" /><style>.slidercaptcha { margin: 0 auto; width: 314px; height: 286px; border-radius: 4px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.125); margin-top: 40px;}.slidercaptcha .card-body { padding: 1rem;}.slidercaptcha canvas:first-child { border-radius: 4px; border: 1px solid #e6e8eb;}.slidercaptcha.card .card-header { background-image: none; background-color: rgba(0, 0, 0, 0.03);}.refreshIcon { top: -54px;}</style></head><body><div class="container-fluid"> <div class="form-row"> <div class="col-12"> <div class="slidercaptcha card"> <div class="card-header">  <span>請完成安全驗證</span> </div> <div class="card-body"><div id="captcha"></div></div> </div> </div> </div></div><script src="js/jquery-1.11.0.min.js" type="text/javascript"></script><script src="disk/longbow.slidercaptcha.js"></script><script> $('#captcha').sliderCaptcha({ repeatIcon: 'fa fa-redo', setSrc: function () { return 'http://images.sdgxgz.com/Pic' + Math.round(Math.random() * 136) + '.jpg'; }, onSuccess: function () { alert('驗證通過!'); } });</script></body></html>disk/slidercaptcha.css:body { overflow-x: hidden;}.block { position: absolute; left: 0; top: 0;}.sliderContainer { position: relative; text-align: center; line-height: 40px; background: #f7f9fa; color: #45494c; border-radius: 2px;}.sliderbg { position: absolute; left: 0; right: 0; top: 0; background-color: #f7f9fa; height: 40px; border-radius: 2px; border: 1px solid #e6e8eb;}.sliderContainer_active .slider { top: -1px; border: 1px solid #1991FA;}.sliderContainer_active .sliderMask { border-width: 1px 0 1px 1px;}.sliderContainer_success .slider { top: -1px; border: 1px solid #52CCBA; background-color: #52CCBA !important;}.sliderContainer_success .sliderMask { border: 1px solid #52CCBA; border-width: 1px 0 1px 1px; background-color: #D2F4EF;}.sliderContainer_success .sliderIcon:before { content: "/f00c";}.sliderContainer_fail .slider { top: -1px; border: 1px solid #f57a7a; background-color: #f57a7a !important;}.sliderContainer_fail .sliderMask { border: 1px solid #f57a7a; background-color: #fce1e1; border-width: 1px 0 1px 1px;}.sliderContainer_fail .sliderIcon:before { content: "/f00d";}.sliderContainer_active .sliderText, .sliderContainer_success .sliderText, .sliderContainer_fail .sliderText { display: none;}.sliderMask { position: absolute; left: 0; top: 0; height: 40px; border: 0 solid #1991FA; background: #D1E9FE; border-radius: 2px;}.slider { position: absolute; top: 0; left: 0; width: 40px; height: 40px; background: #fff; box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); cursor: pointer; transition: background .2s linear; border-radius: 2px; display: flex; align-items: center; justify-content: center;}.slider:hover { background: #1991FA;}.slider:hover .sliderIcon { background-position: 0 -13px;}.sliderText { position: relative;}.sliderIcon {}.refreshIcon { position: absolute; right: 0; top: 0; cursor: pointer; margin: 6px; color: rgba(0,0,0,.25); font-size: 1rem; z-index: 5; transition: color .3s linear;} .refreshIcon:hover { color: #6c757d; }disk/longbow.slidercaptcha.js:(function ($) { 'use strict'; var SliderCaptcha = function (element, options) {  this.$element = $(element);  this.options = $.extend({}, SliderCaptcha.DEFAULTS, options);  this.$element.css({ 'position': 'relative', 'width': this.options.width + 'px', 'margin': '0 auto' });  this.init(); }; SliderCaptcha.VERSION = '1.0'; SliderCaptcha.Author = 'argo@163.com'; SliderCaptcha.DEFAULTS = {  width: 280,  // canvas寬度  height: 155, // canvas高度  PI: Math.PI,  sliderL: 42, // 滑塊邊長  sliderR: 9,  // 滑塊半徑  offset: 5,  // 容錯偏差  loadingText: '正在加載中...',  failedText: '再試一次',  barText: '向右滑動填充拼圖',  repeatIcon: 'fa fa-repeat',  maxLoadCount: 3,  localImages: function () {   return 'images/Pic' + Math.round(Math.random() * 4) + '.jpg';  } }; function Plugin(option) {  return this.each(function () {   var $this = $(this);   var data = $this.data('lgb.SliderCaptcha');   var options = typeof option === 'object' && option;   if (data && !/reset/.test(option)) return;   if (!data) $this.data('lgb.SliderCaptcha', data = new SliderCaptcha(this, options));   if (typeof option === 'string') data[option]();  }); } $.fn.sliderCaptcha = Plugin; $.fn.sliderCaptcha.Constructor = SliderCaptcha; var _proto = SliderCaptcha.prototype; _proto.init = function () {  this.initDOM();  this.initImg();  this.bindEvents(); }; _proto.initDOM = function () {  var createElement = function (tagName, className) {   var elment = document.createElement(tagName);   elment.className = className;   return elment;  };  var createCanvas = function (width, height) {   var canvas = document.createElement('canvas');   canvas.width = width;   canvas.height = height;   return canvas;  };  var canvas = createCanvas(this.options.width - 2, this.options.height) // 畫布  var block = canvas.cloneNode(true) // 滑塊  var sliderContainer = createElement('div', 'sliderContainer');  var refreshIcon = createElement('i', 'refreshIcon ' + this.options.repeatIcon);  var sliderMask = createElement('div', 'sliderMask');  var sliderbg = createElement('div', 'sliderbg');  var slider = createElement('div', 'slider');  var sliderIcon = createElement('i', 'fa fa-arrow-right sliderIcon');  var text = createElement('span', 'sliderText');  block.className = 'block'  text.innerHTML = this.options.barText;  var el = this.$element;  el.append($(canvas));  el.append($(refreshIcon));  el.append($(block));  slider.appendChild(sliderIcon);  sliderMask.appendChild(slider);  sliderContainer.appendChild(sliderbg);  sliderContainer.appendChild(sliderMask);  sliderContainer.appendChild(text);  el.append($(sliderContainer));  Object.assign(this, {   canvas,   block,   sliderContainer: $(sliderContainer),   refreshIcon,   slider,   sliderMask,   sliderIcon,   text: $(text),   canvasCtx: canvas.getContext('2d'),   blockCtx: block.getContext('2d')  }) }; _proto.initImg = function () {  var that = this;  var isIE = window.navigator.userAgent.indexOf('Trident') > -1;  var L = this.options.sliderL + this.options.sliderR * 2 + 3; // 滑塊實際邊長  var drawImg = function (ctx, operation) {   var l = that.options.sliderL;   var r = that.options.sliderR;   var PI = that.options.PI;   var x = that.x;   var y = that.y;   ctx.beginPath()   ctx.moveTo(x, y)   ctx.arc(x + l / 2, y - r + 2, r, 0.72 * PI, 2.26 * PI)   ctx.lineTo(x + l, y)   ctx.arc(x + l + r - 2, y + l / 2, r, 1.21 * PI, 2.78 * PI)   ctx.lineTo(x + l, y + l)   ctx.lineTo(x, y + l)   ctx.arc(x + r - 2, y + l / 2, r + 0.4, 2.76 * PI, 1.24 * PI, true)   ctx.lineTo(x, y)   ctx.lineWidth = 2   ctx.fillStyle = 'rgba(255, 255, 255, 0.7)'   ctx.strokeStyle = 'rgba(255, 255, 255, 0.7)'   ctx.stroke()   ctx[operation]()   ctx.globalCompositeOperation = isIE ? 'xor' : 'overlay'  }  var getRandomNumberByRange = function (start, end) {   return Math.round(Math.random() * (end - start) + start);  };  var img = new Image();  img.crossOrigin = "Anonymous";  var loadCount = 0;  img.onload = function () {   // 隨機創建滑塊的位置   that.x = getRandomNumberByRange(L + 10, that.options.width - (L + 10));   that.y = getRandomNumberByRange(10 + that.options.sliderR * 2, that.options.height - (L + 10));   drawImg(that.canvasCtx, 'fill');   drawImg(that.blockCtx, 'clip');   that.canvasCtx.drawImage(img, 0, 0, that.options.width - 2, that.options.height);   that.blockCtx.drawImage(img, 0, 0, that.options.width - 2, that.options.height);   var y = that.y - that.options.sliderR * 2 - 1;   var ImageData = that.blockCtx.getImageData(that.x - 3, y, L, L);   that.block.width = L;   that.blockCtx.putImageData(ImageData, 0, y);   that.text.text(that.text.attr('data-text'));  };  img.onerror = function () {   loadCount++;   if (window.location.protocol === 'file:') {    loadCount = that.options.maxLoadCount;    console.error("can't load pic resource file from File protocal. Please try http or https");   }   if (loadCount >= that.options.maxLoadCount) {    that.text.text('加載失敗').addClass('text-danger');    return;   }   img.src = that.options.localImages();  };  img.setSrc = function () {   var src = '';   loadCount = 0;   that.text.removeClass('text-danger');   if ($.isFunction(that.options.setSrc)) src = that.options.setSrc();   if (!src || src === '') src = 'https://picsum.photos/' + that.options.width + '/' + that.options.height + '/?image=' + Math.round(Math.random() * 20);   if (isIE) { // IE瀏覽器無法通過img.crossOrigin跨域,使用ajax獲取圖片blob然后轉為dataURL顯示    var xhr = new XMLHttpRequest()    xhr.onloadend = function (e) {     var file = new FileReader(); // FileReader僅支持IE10+     file.readAsDataURL(e.target.response);     file.onloadend = function (e) {      img.src = e.target.result;     }    }    xhr.open('GET', src);    xhr.responseType = 'blob';    xhr.send();   } else img.src = src;  };  img.setSrc();  this.text.attr('data-text', this.options.barText);  this.text.text(this.options.loadingText);  this.img = img }; _proto.clean = function () {  this.canvasCtx.clearRect(0, 0, this.options.width, this.options.height);  this.blockCtx.clearRect(0, 0, this.options.width, this.options.height);  this.block.width = this.options.width; }; _proto.bindEvents = function () {  var that = this;  this.$element.on('selectstart', function () {   return false;  });  $(this.refreshIcon).on('click', function () {   that.text.text(that.options.barText);   that.reset();   if ($.isFunction(that.options.onRefresh)) that.options.onRefresh.call(that.$element);  });  var originX, originY, trail = [],   isMouseDown = false  var handleDragStart = function (e) {   if (that.text.hasClass('text-danger')) return;   originX = e.clientX || e.touches[0].clientX;   originY = e.clientY || e.touches[0].clientY;   isMouseDown = true;  };  var handleDragMove = function (e) {   if (!isMouseDown) return false;   var eventX = e.clientX || e.touches[0].clientX;   var eventY = e.clientY || e.touches[0].clientY;   var moveX = eventX - originX;   var moveY = eventY - originY;   if (moveX < 0 || moveX + 40 > that.options.width) return false;   that.slider.style.left = (moveX - 1) + 'px';   var blockLeft = (that.options.width - 40 - 20) / (that.options.width - 40) * moveX;   that.block.style.left = blockLeft + 'px';   that.sliderContainer.addClass('sliderContainer_active');   that.sliderMask.style.width = (moveX + 4) + 'px';   trail.push(moveY);  };  var handleDragEnd = function (e) {   if (!isMouseDown) return false   isMouseDown = false   var eventX = e.clientX || e.changedTouches[0].clientX   if (eventX == originX) return false   that.sliderContainer.removeClass('sliderContainer_active');   that.trail = trail   var {    spliced,    verified   } = that.verify()   if (spliced && verified) {    that.sliderContainer.addClass('sliderContainer_success');    if ($.isFunction(that.options.onSuccess)) that.options.onSuccess.call(that.$element);   } else {    that.sliderContainer.addClass('sliderContainer_fail');    if ($.isFunction(that.options.onFail)) that.options.onFail.call(that.$element);    setTimeout(() => {     that.text.text(that.options.failedText);     that.reset();    }, 1000);   }  };  this.slider.addEventListener('mousedown', handleDragStart);  this.slider.addEventListener('touchstart', handleDragStart);  document.addEventListener('mousemove', handleDragMove);  document.addEventListener('touchmove', handleDragMove);  document.addEventListener('mouseup', handleDragEnd);  document.addEventListener('touchend', handleDragEnd);  document.addEventListener('mousedown', function () { return false; });  document.addEventListener('touchstart', function () { return false; }); }; _proto.verify = function () {  var sum = function (x, y) { return x + y; };  var square = function (x) { return x * x; };  var arr = this.trail // 拖動時y軸的移動距離  var average = arr.reduce(sum) / arr.length;  var deviations = arr.map(function (x) { return x - average; });  var stddev = Math.sqrt(deviations.map(square).reduce(sum) / arr.length);  var left = parseInt(this.block.style.left);  return {   spliced: Math.abs(left - this.x) < this.options.offset,   verified: stddev !== 0, // 簡單驗證下拖動軌跡,為零時表示Y軸上下沒有波動,可能非人為操作  } }; _proto.reset = function () {  this.sliderContainer.removeClass('sliderContainer_fail sliderContainer_success');  this.slider.style.left = 0  this.block.style.left = 0  this.sliderMask.style.width = 0  this.clean()  this.text.attr('data-text', this.text.text());  this.text.text(this.options.loadingText);  this.img.setSrc(); };})(jQuery);

附錄1:需要注意css和js的引用路徑;

總結

以上所述是小編給大家介紹的html+jQuery實現拖動滑塊圖片拼圖驗證碼插件希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
岛国av一区二区在线在线观看| 欧美第一页在线| 久久久亚洲欧洲日产国码aⅴ| 欧美黄色片免费观看| 日韩av网址在线| 91免费在线视频网站| 国产免费亚洲高清| 久久精品中文字幕一区| 狠狠干狠狠久久| 欧美性少妇18aaaa视频| 国产精品久久在线观看| 两个人的视频www国产精品| 91久久久久久久久| 久久人91精品久久久久久不卡| 2021国产精品视频| 91久久国产婷婷一区二区| 亚洲精品免费一区二区三区| 日韩av毛片网| 亚洲国产精品久久久久久| 成人欧美一区二区三区在线湿哒哒| 成人免费午夜电影| 欧美日韩美女视频| 26uuu另类亚洲欧美日本老年| 亚洲影视中文字幕| 韩国福利视频一区| 97人人模人人爽人人喊中文字| 尤物yw午夜国产精品视频| 国产精品三级在线| 欧美性理论片在线观看片免费| 国产在线观看一区二区三区| 人妖精品videosex性欧美| 久久久久久久97| 亚洲精品视频网上网址在线观看| 国产精品丝袜久久久久久高清| 国产精品美女在线| 色婷婷av一区二区三区久久| 亚洲的天堂在线中文字幕| 亚洲在线www| 在线播放精品一区二区三区| 韩日精品中文字幕| 欧洲美女免费图片一区| 亚洲综合一区二区不卡| 国自在线精品视频| 久久久久久久999精品视频| 欧美精品video| 日韩在线视频线视频免费网站| 欧美精品久久久久久久| 日韩视频免费在线观看| 亚洲乱亚洲乱妇无码| 日本精品视频在线| 久久久久久久久国产精品| 日韩电视剧在线观看免费网站| 亚洲毛片在线看| 色综久久综合桃花网| 欧美日韩黄色大片| 欧美日韩综合视频| 欧美大片网站在线观看| 国产成人在线视频| 亚洲成色www8888| 国产精品爽爽ⅴa在线观看| 国产精品一区二区久久精品| 国产精品久久久久9999| 亚洲欧美国产日韩天堂区| 久久福利视频导航| 亚洲人成77777在线观看网| 成人av电影天堂| 日韩在线视频观看正片免费网站| 亚洲第一色中文字幕| 日本aⅴ大伊香蕉精品视频| 日韩精品免费在线观看| 最近日韩中文字幕中文| 色系列之999| 欧美最猛性xxxxx亚洲精品| 久久福利视频网| 国产亚洲精品成人av久久ww| 亚洲国产日韩欧美在线99| 欧美在线观看www| 国产一区二区日韩| 欧美贵妇videos办公室| 成人中文字幕在线观看| 国产精品视频久| 亚洲国产精品久久久久秋霞蜜臀| 国产日韩换脸av一区在线观看| 日韩免费精品视频| 国产精品久在线观看| 国产精品一二区| 亚洲天堂av在线免费| 国产日韩精品在线播放| 久久视频在线看| 91在线视频一区| 日韩激情av在线免费观看| 8x拔播拔播x8国产精品| 欧美性开放视频| 国产精品久久久久久av福利软件| 久久精品国产亚洲| 免费91麻豆精品国产自产在线观看| 欧美性少妇18aaaa视频| 一本色道久久88综合日韩精品| 国产精品视频一区二区三区四| 这里只有视频精品| 国产精品白嫩初高中害羞小美女| 国产美女被下药99| 欧美视频裸体精品| 国产精品久久久999| 中文字幕不卡在线视频极品| 国产在线日韩在线| 国产亚洲精品日韩| 亚洲精品456在线播放狼人| 日韩视频永久免费观看| 亚洲国产精品久久久久秋霞蜜臀| 另类美女黄大片| 欧美激情a∨在线视频播放| 日本久久久久亚洲中字幕| 色狠狠av一区二区三区香蕉蜜桃| 青青草99啪国产免费| 欧美在线一区二区三区四| 日韩亚洲国产中文字幕| 精品久久久香蕉免费精品视频| 国产乱肥老妇国产一区二| 日韩中文字幕亚洲| 狠狠躁18三区二区一区| 亚洲精品99999| 欧美午夜精品久久久久久浪潮| 久久精品成人欧美大片| 亚洲色图五月天| 久久久精品免费视频| 国产一区二区三区三区在线观看| 日韩欧美综合在线视频| 国产成人久久精品| 7777免费精品视频| 亚洲伊人第一页| 九九久久综合网站| 欧美性视频网站| 国产欧美精品久久久| 欧美亚洲日本黄色| 欧美成人黑人xx视频免费观看| 日韩精品一区二区视频| 日本一区二区在线播放| 成人xxxxx| 日韩免费av一区二区| 久久久国产在线视频| 日韩精品欧美激情| 国产欧美日韩中文| 国产精品久久久久福利| 国产九九精品视频| 国产精品夜间视频香蕉| 午夜精品视频网站| 在线国产精品视频| 国产日韩欧美日韩| 国产亚洲一区二区精品| 中文字幕亚洲无线码在线一区| 成人www视频在线观看| 成人免费网站在线| 亚洲欧美日韩国产中文专区| 91久久精品国产| 中文日韩在线观看| 91精品久久久久久久久久久久久久| 日韩**中文字幕毛片| 欧美激情免费观看| 欧美激情综合亚洲一二区| 欧美国产亚洲精品久久久8v| 久久香蕉国产线看观看av| 成人a在线观看| 91九色国产视频|