JavaScript封装拖动滑块验证

article/2025/11/9 7:55:13

原生JS封装拖动验证滑块

    • 最终效果
    • 分析
    • 最终如何使用?
    • 编写库的整体初始框架
      • 编写核心函数1(创建dom和css)
      • 编写核心函数2(绑定事件)
      • 添加工具方法(核心函数2中用到的)
    • 最终完整可运行代码
    • 使用

最终效果

在这里插入图片描述

分析

看到这个效果我们首先应该想到和拖动有关的api: onmousedown, onmousemove, onmouseup

其次要支持用户传入放置这个组件的dom元素和完成的回调事件。

最终如何使用?

我们先来看下使用方式,再来决定我们怎么编写这个库
在这里插入图片描述

编写库的整体初始框架

(function () {// =================代码块1=========================================var root = (typeof self == 'object' && self.self == self && self) ||(typeof global == 'object' && global.global == global && global) ||this || {}; var util = {extend: function (target) {for (var i = 1, len = arguments.length; i < len; i++) {for (var prop in arguments[i]) {if (arguments[i].hasOwnProperty(prop)) {target[prop] = arguments[i][prop]}}}return target},isValidListener: function (listener) {if (typeof listener === 'function') {return true} else if (listener && typeof listener === 'object') {return util.isValidListener(listener.listener)} else {return false}},addCSS: function (cssText) {var style = document.createElement('style'),  //创建一个style元素head = document.head || document.getElementsByTagName('head')[0]; //获取head元素style.type = 'text/css'; //这里必须显示设置style元素的type属性为text/css,否则在ie中不起作用if (style.styleSheet) { //IEvar func = function () {try { //防止IE中stylesheet数量超过限制而发生错误style.styleSheet.cssText = cssText;} catch (e) {}}//如果当前styleSheet还不能用,则放到异步中则行if (style.styleSheet.disabled) {setTimeout(func, 10);} else {func();}} else { //w3c//w3c浏览器中只要创建文本节点插入到style元素中就行了var textNode = document.createTextNode(cssText);style.appendChild(textNode);}head.appendChild(style); //把创建的style元素插入到head中},indexOf: function (array, item) {if (array.indexOf) {return array.indexOf(item);} else {var result = -1;for (var i = 0, len = array.length; i < len; i++) {if (array[i] === item) {result = i;break;}}return result;}}}function EventEmitter() {this._events = {}}EventEmitter.prototype.on = function (eventName, listener) {if (!eventName || !listener) return;if (!util.isValidListener(listener)) {throw new TypeError('listener must be a function');}var events = this._events;var listeners = events[eventName] = events[eventName] || [];var listenerIsWrapped = typeof listener === 'object';// 不重复添加事件if (util.indexOf(listeners, listener) === -1) {listeners.push(listenerIsWrapped ? listener : {listener: listener,once: false});}return this;};EventEmitter.prototype.once = function (eventName, listener) {return this.on(eventName, {listener: listener,once: true})};EventEmitter.prototype.off = function (eventName, listener) {var listeners = this._events[eventName];if (!listeners) return;var index;for (var i = 0, len = listeners.length; i < len; i++) {if (listeners[i] && listeners[i].listener === listener) {index = i;break;}}if (typeof index !== 'undefined') {listeners.splice(index, 1, null)}return this;};EventEmitter.prototype.emit = function (eventName, args) {var listeners = this._events[eventName];if (!listeners) return;for (var i = 0; i < listeners.length; i++) {var listener = listeners[i];if (listener) {listener.listener.apply(this, args || []);if (listener.once) {this.off(eventName, listener.listener)}}}return this;};// =================代码块2=========================================function SliderTools(options) {this.options = util.extend({}, this.constructor.defaultOptions, options)this.init();this.bindEvents();this.diffX = 0;this.flag = false;//是否拖动到最右侧}SliderTools.defaultOptions = {el: document.body //默认放到body里};var proto = SliderTools.prototype = new EventEmitter();//SliderTools继承emitterproto.constructor = SliderTools;//修正构造器proto.init = function () {this.createSlider();//创建插件所需要的dom元素this.getElements();//获取创建好的元素}// =================代码块3=========================================if (typeof exports != 'undefined' && !exports.nodeType) {if (typeof module != 'undefined' && !module.nodeType && module.exports) {exports = module.exports = SliderTools;}exports.SliderTools = SliderTools;} else {root.SliderTools = SliderTools;}
}());

代码块1是在判断是在浏览器环境还是nodeJS环境,方便代码三后期使用, 代码块2声明了一个对象 S l i d e r T o o l s \color{#FF3030}{SliderTools} SliderTools,将用户传进来的 o p t i o n \color{#FF3030}{option} option和默认的 d e f a u l t O p t i o n \color{#FF3030}{defaultOption} defaultOption进行合并

编写核心函数1(创建dom和css)

proto.createSlider = function () {this.options.el.innerHTML = '<div id="slider"><div class="drag_bg"></div><div class="drag_text" onselectstart="return false;" unselectable="on">拖动滑块验证</div><div class="handler handler_bg"></div></div>';//像指定元素中放置插件的dom元素util.addCSS('ul,li {list-style: none;} a {text-decoration: none;} .wrap {width: 300px;height: 350px;text-align: center;margin: 150px auto;}.inner {padding: 15px;} .clearfix {overflow: hidden;_zoom: 1;} .none {display: none;} #slider {position:relative;background-color: #e8e8e8;width: 300px;height: 34px;line-height: 34px;text-align: center;} #slider .handler {position: absolute;top: 0px;left: 0px;width: 40px;height: 32px;border: 1px solid #ccc;cursor: move;}    .handler_bg {background: #fff  url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTEyNTVEMURGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTEyNTVEMUNGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MTc5NzNmZS02OTQxLTQyOTYtYTIwNi02NDI2YTNkOWU5YmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YiRG4AAAALFJREFUeNpi/P//PwMlgImBQkA9A+bOnfsIiBOxKcInh+yCaCDuByoswaIOpxwjciACFegBqZ1AvBSIS5OTk/8TkmNEjwWgQiUgtQuIjwAxUF3yX3xyGIEIFLwHpKyAWB+I1xGSwxULIGf9A7mQkBwTlhBXAFLHgPgqEAcTkmNCU6AL9d8WII4HOvk3ITkWJAXWUMlOoGQHmsE45ViQ2KuBuASoYC4Wf+OUYxz6mQkgwAAN9mIrUReCXgAAAABJRU5ErkJggg==") no-repeat center;} .handler_ok_bg {background: #fff    url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDlBRDI3NjVGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDlBRDI3NjRGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphNWEzMWNhMC1hYmViLTQxNWEtYTEwZS04Y2U5NzRlN2Q4YTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+k+sHwwAAASZJREFUeNpi/P//PwMyKD8uZw+kUoDYEYgloMIvgHg/EM/ptHx0EFk9I8wAoEZ+IDUPiIMY8IN1QJwENOgj3ACo5gNAbMBAHLgAxA4gQ5igAnNJ0MwAVTsX7IKyY7L2UNuJAf+AmAmJ78AEDTBiwGYg5gbifCSxFCZoaBMCy4A4GOjnH0D6DpK4IxNSVIHAfSDOAeLraJrjgJp/AwPbHMhejiQnwYRmUzNQ4VQgDQqXK0ia/0I17wJiPmQNTNBEAgMlQIWiQA2vgWw7QppBekGxsAjIiEUSBNnsBDWEAY9mEFgMMgBk00E0iZtA7AHEctDQ58MRuA6wlLgGFMoMpIG1QFeGwAIxGZo8GUhIysmwQGSAZgwHaEZhICIzOaBkJkqyM0CAAQDGx279Jf50AAAAAABJRU5ErkJggg==")    no-repeat center;}#slider .drag_bg {background-color: #7ac23c;    height: 34px;width: 0px;} #slider .drag_text {position: absolute;    top: 0px;width: 300px;-moz-user-select: none;-webkit-user-select: none;user-select: none;-o-user-select: none;-ms-user-select: none;    }.unselect {-moz-user-select: none;-webkit-user-select: none;    -ms-user-select: none;}.slide_ok {color: #fff;}')//像页面里add新的样式
}
proto.getElements = function () {this.slider = document.querySelector('#slider');this.drag_bg = document.querySelector('.drag_bg');this.handler = document.querySelector('.handler');
}

编写核心函数2(绑定事件)

proto.bindEvents = function () {var self = this;self.handler.onmousedown = function (e) {self.diffX = e.clientX - self.handler.offsetLeft;util.setClassName(self.slider, 'unselect'); //禁止选择样式document.onmousemove = function (e) {let deltaX = e.clientX - self.diffX;if (deltaX >= self.slider.offsetWidth - self.handler.offsetWidth) { //拖动到了最右侧deltaX = self.slider.offsetWidth - self.handler.offsetWidth;self.flag = true;} else if (deltaX <= 0) {deltaX = 0;self.flag = false;} else {self.flag = false;}util.setInlineStyle([self.handler], 'left', deltaX + 'px');util.setInlineStyle([self.drag_bg], 'width', deltaX + 'px');}document.onmouseup = function (e) {util.setClassName(self.slider, '')if (self.flag) {util.setClassName(self.slider, 'slide_ok') //拖动完成后的样式util.addClass(self.handler, 'handler_ok_bg')拖动完成后的样式self.handler.onmousedown = null //防止拖动完成后再次拖动self.emit('complete')//emit通知使用者的回调事件} else {util.setInlineStyle([self.handler], 'left', 0 + 'px');util.setInlineStyle([self.drag_bg], 'width', 0 + 'px');}document.onmousemove = null;document.onmouseup = null;}}
}

添加工具方法(核心函数2中用到的)

var util = {// ...初始框架里的那部分setClassName(selector, className) {selector.className = className;},addClass(selector, className) {selector.classList.add(className);},setInlineStyle(selector, attr, content) {let length = selector.length;for (let i = 0; i < length; i++) {selector[i].style[attr] = content;}},
}

最终完整可运行代码

(function () {var root = (typeof self == 'object' && self.self == self && self) ||(typeof global == 'object' && global.global == global && global) ||this || {};var util = {extend: function (target) {for (var i = 1, len = arguments.length; i < len; i++) {for (var prop in arguments[i]) {if (arguments[i].hasOwnProperty(prop)) {target[prop] = arguments[i][prop]}}}return target},setClassName(selector, className) {selector.className = className;},addClass(selector, className) {selector.classList.add(className);},setInlineStyle(selector, attr, content) {let length = selector.length;for (let i = 0; i < length; i++) {selector[i].style[attr] = content;}},isValidListener: function (listener) {if (typeof listener === 'function') {return true} else if (listener && typeof listener === 'object') {return util.isValidListener(listener.listener)} else {return false}},addCSS: function (cssText) {var style = document.createElement('style'),  //创建一个style元素head = document.head || document.getElementsByTagName('head')[0]; //获取head元素style.type = 'text/css'; //这里必须显示设置style元素的type属性为text/css,否则在ie中不起作用if (style.styleSheet) { //IEvar func = function () {try { //防止IE中stylesheet数量超过限制而发生错误style.styleSheet.cssText = cssText;} catch (e) {}}//如果当前styleSheet还不能用,则放到异步中则行if (style.styleSheet.disabled) {setTimeout(func, 10);} else {func();}} else { //w3c//w3c浏览器中只要创建文本节点插入到style元素中就行了var textNode = document.createTextNode(cssText);style.appendChild(textNode);}head.appendChild(style); //把创建的style元素插入到head中},indexOf: function (array, item) {if (array.indexOf) {return array.indexOf(item);} else {var result = -1;for (var i = 0, len = array.length; i < len; i++) {if (array[i] === item) {result = i;break;}}return result;}}}function EventEmitter() {this._events = {}}EventEmitter.prototype.on = function (eventName, listener) {if (!eventName || !listener) return;if (!util.isValidListener(listener)) {throw new TypeError('listener must be a function');}var events = this._events;var listeners = events[eventName] = events[eventName] || [];var listenerIsWrapped = typeof listener === 'object';// 不重复添加事件if (util.indexOf(listeners, listener) === -1) {listeners.push(listenerIsWrapped ? listener : {listener: listener,once: false});}return this;};EventEmitter.prototype.once = function (eventName, listener) {return this.on(eventName, {listener: listener,once: true})};EventEmitter.prototype.off = function (eventName, listener) {var listeners = this._events[eventName];if (!listeners) return;var index;for (var i = 0, len = listeners.length; i < len; i++) {if (listeners[i] && listeners[i].listener === listener) {index = i;break;}}if (typeof index !== 'undefined') {listeners.splice(index, 1, null)}return this;};EventEmitter.prototype.emit = function (eventName, args) {var listeners = this._events[eventName];if (!listeners) return;for (var i = 0; i < listeners.length; i++) {var listener = listeners[i];if (listener) {listener.listener.apply(this, args || []);if (listener.once) {this.off(eventName, listener.listener)}}}return this;};function SliderTools(options) {this.options = util.extend({}, this.constructor.defaultOptions, options)this.init();this.bindEvents();this.diffX = 0;this.flag = false;}SliderTools.VERSION = '1.0.0';SliderTools.defaultOptions = {el: document.body};var proto = SliderTools.prototype = new EventEmitter();proto.constructor = SliderTools;proto.init = function () {this.createSlider();this.getElements();}proto.createSlider = function () {this.options.el.innerHTML = '<div id="slider"><div class="drag_bg"></div><div class="drag_text" onselectstart="return false;" unselectable="on">拖动滑块验证</div><div class="handler handler_bg"></div></div>';util.addCSS('ul, li {    list-style: none;    }    a {    text-decoration: none;    }    .wrap {    width: 300px;    height: 350px;    text-align: center;    margin: 150px auto;    }    .inner {    padding: 15px;    }    .clearfix {    overflow: hidden;    _zoom: 1;    }    .none {    display: none;    }    #slider {    position: relative;    background-color: #e8e8e8;    width: 300px;    height: 34px;    line-height: 34px;    text-align: center;    }    #slider .handler {    position: absolute;    top: 0px;    left: 0px;    width: 40px;    height: 32px;    border: 1px solid #ccc;    cursor: move;}    .handler_bg {    background: #fff    url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTEyNTVEMURGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTEyNTVEMUNGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MTc5NzNmZS02OTQxLTQyOTYtYTIwNi02NDI2YTNkOWU5YmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YiRG4AAAALFJREFUeNpi/P//PwMlgImBQkA9A+bOnfsIiBOxKcInh+yCaCDuByoswaIOpxwjciACFegBqZ1AvBSIS5OTk/8TkmNEjwWgQiUgtQuIjwAxUF3yX3xyGIEIFLwHpKyAWB+I1xGSwxULIGf9A7mQkBwTlhBXAFLHgPgqEAcTkmNCU6AL9d8WII4HOvk3ITkWJAXWUMlOoGQHmsE45ViQ2KuBuASoYC4Wf+OUYxz6mQkgwAAN9mIrUReCXgAAAABJRU5ErkJggg==")    no-repeat center;    }    .handler_ok_bg {    background: #fff    url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDlBRDI3NjVGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDlBRDI3NjRGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphNWEzMWNhMC1hYmViLTQxNWEtYTEwZS04Y2U5NzRlN2Q4YTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+k+sHwwAAASZJREFUeNpi/P//PwMyKD8uZw+kUoDYEYgloMIvgHg/EM/ptHx0EFk9I8wAoEZ+IDUPiIMY8IN1QJwENOgj3ACo5gNAbMBAHLgAxA4gQ5igAnNJ0MwAVTsX7IKyY7L2UNuJAf+AmAmJ78AEDTBiwGYg5gbifCSxFCZoaBMCy4A4GOjnH0D6DpK4IxNSVIHAfSDOAeLraJrjgJp/AwPbHMhejiQnwYRmUzNQ4VQgDQqXK0ia/0I17wJiPmQNTNBEAgMlQIWiQA2vgWw7QppBekGxsAjIiEUSBNnsBDWEAY9mEFgMMgBk00E0iZtA7AHEctDQ58MRuA6wlLgGFMoMpIG1QFeGwAIxGZo8GUhIysmwQGSAZgwHaEZhICIzOaBkJkqyM0CAAQDGx279Jf50AAAAAABJRU5ErkJggg==")    no-repeat center;    }    #slider .drag_bg {    background-color: #7ac23c;    height: 34px;    width: 0px;       }    #slider .drag_text {    position: absolute;    top: 0px;    width: 300px;    -moz-user-select: none;    -webkit-user-select: none;    user-select: none;    -o-user-select: none;    -ms-user-select: none;    }    .unselect {    -moz-user-select: none;    -webkit-user-select: none;    -ms-user-select: none;    }    .slide_ok {    color: #fff;    }')}proto.getElements = function () {this.slider = document.querySelector('#slider');this.drag_bg = document.querySelector('.drag_bg');this.handler = document.querySelector('.handler');}proto.bindEvents = function () {var self = this;self.handler.onmousedown = function (e) {self.diffX = e.clientX - self.handler.offsetLeft;util.setClassName(self.slider, 'unselect');document.onmousemove = function (e) {let deltaX = e.clientX - self.diffX;if (deltaX >= self.slider.offsetWidth - self.handler.offsetWidth) {deltaX = self.slider.offsetWidth - self.handler.offsetWidth;self.flag = true;} else if (deltaX <= 0) {deltaX = 0;self.flag = false;} else {self.flag = false;}util.setInlineStyle([self.handler], 'left', deltaX + 'px');util.setInlineStyle([self.drag_bg], 'width', deltaX + 'px');}document.onmouseup = function (e) {util.setClassName(self.slider, '')if (self.flag) {util.setClassName(self.slider, 'slide_ok')util.addClass(self.handler, 'handler_ok_bg')self.handler.onmousedown = nullself.emit('complete')} else {util.setInlineStyle([self.handler], 'left', 0 + 'px');util.setInlineStyle([self.drag_bg], 'width', 0 + 'px');}document.onmousemove = null;document.onmouseup = null;}}}if (typeof exports != 'undefined' && !exports.nodeType) {if (typeof module != 'undefined' && !module.nodeType && module.exports) {exports = module.exports = SliderTools;}exports.SliderTools = SliderTools;} else {root.SliderTools = SliderTools;}
}());let slider = new SliderTools();
slider.on('complete',() => {alert('验证完成');
})

使用

<script src="./SliderTools.js"></script>

或者

import SliderTools from './SliderTools.js'

http://chatgpt.dhexx.cn/article/fWqdOu3i.shtml

相关文章

vue拖动滑块验证组件

组件Slider.vue <template><div class"drag" ref"dragDiv"><div class"drag_bg"></div><div class"drag_text">{{ confirmWords }}</div><div ref"moveDiv" mousedown"moused…

js实现拖动滑块验证

介绍一个比较6的网站&#xff1a;Element.setPointerCapture() - Web API 接口参考 | MDN 里面用到的setPointerCapture&#xff0c;getBoundingClientRect方法都是这个网站里面有的 &#xff08;看看效果图&#xff0c;动态图我不知道怎么搞&#xff0c;简单来说就是没拉到底…

php拖动滑块验证原理,原生js实现拖动滑块验证

原生js实现拖动滑块验证题 前言 验证的目的是为了减轻超高数据量的访问时,服务器的压力,减少同时请求量;前端基本都不能避免与验证打交道,这里记录一下我对于滑块验证的学习过程。 思路 作为前端,我们要将自己带入用户的角度,对用户的操作习惯进行考虑,我将拖动滑块验证…

Vue - 滑块拖动拼图验证(滑块验证安全检测)

前言 😃 提供您一个示例,您可以轻松移植到您项目中。 您一定见过很多系统都 “配备” 了滑块验证、拼图验证、找不同等, 本质上都是为了验证登录系统的是人还是机器(代码), 如下图所示效果:

Uipath实现简单的滑块拖动验证

本篇文章主要介绍使用【Click】Activities这一个活动来实现拖动滑块的验证&#xff0c;为拖动滑块验证提供了一种思路。但只能应用于滑块从头滑到尾&#xff0c;不支持拼图的滑块验证。 说白了&#xff0c;这篇文章更像是介绍【Click】这个Activities中&#xff0c;"clic…

数据库技术与应用 学习笔记1

1.软件的安装 SQL Server 2019 安装教程 大佬的安装教程链接: https://blog.csdn.net/CHQC388/article/details/104550963. 2.数据库技术与应用 2.1 什么是数据库技术 数据库技术所研究的问题就是如何科学地组织和存储数据&#xff0c;如何高效地获取和处理数据。 2.2 什么…

SQL Server数据库笔记整理(一)

数据库&#xff1a;持久化存储&#xff0c;优化读写&#xff0c;保证数据的有效性。 关系型数据库是基于E-R模型&#xff08;即实体-模型&#xff09;&#xff0c;使用SQL语言进行操作。数据库分类&#xff1a;文档型数据库、服务型数据库&#xff08;使用居多&#xff09; &am…

软件测试工程师学习笔记11 - 数据库篇

软件测试工程师学习笔记 -11 一、入门必读二、Linux三、数据库1.MySQL基础1&#xff09; sql语言的注释2&#xff09;mysql中常用数据类型3&#xff09;表、字段、记录4&#xff09;数据库中的常用命令4&#xff09;字段的约束5&#xff09;总结 一、入门必读 二、Linux 三、…

计算机三级 数据库技术 学习笔记

版权声明&#xff1a;本文为CSDN博主「RanLZ」的原创文章&#xff0c;转载请附上原文出处链接。 计算机三级 数据库技术 第一章 数据库应用系统开发方法 1.1 数据库应用系统生命周期 1.1.1 软件工程与软件开发方法 瀑布模型快速原型模型螺旋模型 1.1.2 DBAS生命周期模型 p …

数据库系统概论复习笔记

Ch1 绪论 1.1 基本概念 数据Data、数据库DB、数据库管理系统DBMS、数据库系统DBS 数据是数据库中存储的基本对象,是用来描述事物的符号。数据库是长期储存在计算机内的、有组织的、可共享的、大量数据的集合。数据库管理系统位于用户与操作系统之间的一层数据管理软件,用于…

数据库系统概论学习笔记(1)

数据库系统第一章 目录 数据库系统第一章1. 绪论1.1 数据库系统概述1.2 数据(Data)图解注意点例子 1.3 数据库(DataBase)注意点1.4 数据库管理系统(DateBase Management System DBMS)1.5 数据库系统(DateBase System,DBS)1.6 数据库管理的三个阶段 1. 绪论 1.1 数据库系统概述…

软件工程学习笔记

其他 【专栏必读】王道考研408操作系统万字笔记&#xff08;有了它不需要你再做笔记了&#xff09;&#xff1a;各章节内容概述导航和思维导图 【专栏必读】王道考研408数据结构万字笔记&#xff08;有了它不需要你再做笔记了&#xff09;&#xff1a;各章节内容概述导航和思维…

数据库原理第七章笔记

一、 数据库设计概述 数据库设计&#xff0c;广义的讲是数据库及其应用系统的设计&#xff0c;即整个数据库应用系统。狭义的讲是设计数据库本身&#xff0c;即设计数据库的各级模式并建立数据库&#xff0c;也是数据库应用系统设计的一部分。 数据库设计是指对于一个给定的应…

软件设计师学习笔记-数据库系统

目录 数据库系统 三级模式-两级映射 数据库设计过程 E-R模型 关系代数 规范化理论-函数依赖 规范化理论-价值与用途​ 规范化理论-键 规范化理论-求候选键 规范化理论-范式 规范化理论-模式分解 并发控制概念 并发控制存在的问题 并发控制的封锁协议 数据库完整…

SQL数据库--笔记

一、数据库概念 1.数据库 数据库&#xff08;DB&#xff09;是存放数据的仓库&#xff0c;按照一定的关联&#xff0c;按照一定的格式存储在计算机中 2.数据库管理系统 数据库管理系统&#xff08;DBMS&#xff09;按一定的数据模型组织数据形成数据库&#xff0c;并对数据…

数据库系统工程师考点笔记

目录 第1章 计算机系统知识1.1 计算机硬件基础知识 11.1.1 中央处理单元 11.1.2 存储器 41.1.3 总线 71.1.4 输入输出控制 10 1.2 计算机体系结构 141.2.1 CISC和RISC…… 151.2.2 流水线技术 161.2.3 阵列处理机、并行处理机和多处理机 19 1.3 存储系统 201.3.1 高速缓存 211.…

高级数据库课程笔记

前言&#xff1a;高级数据库的课程笔记&#xff0c;按提纲整理&#xff0c;部分内容没有整入。 文章目录 其他数据库&#xff1a;XMLDB OODB ORBDXML数据库特点SQL/XML 面向对象对象关系数据库系统中扩展的关系数据类型LOBboolean集合类型array自定义类型distinct面向对象数据…

数据库与软件工程学习笔记(一)——数据库系统介绍

学习内容&#xff1a;数据库系统介绍 前言 笔者系19级电子科技大学的一名学生&#xff0c;针对本学期学习的数据库与软件工程课程&#xff0c;在csdn下记录自己的学习笔记&#xff0c;因为是边学边记录&#xff0c;博客内容难免有不够成熟之处&#xff0c;希望大家可以在评论…

狂神说数据库笔记

文章目录 1.初识数据库1.1、 什么是数据库1.2、数据库分类1.3、MySQl简介1.4、连接数据库 2.操作数据库2.1 操作数据库&#xff08;了解&#xff09;2.2 数据库的列类型2.3、数据库的字段属性&#xff08;重点&#xff09;2.4、创建数据库2.5、数据表的类型2.6、删改数据库 3.M…

号称程序员的最后一款笔记软件!来看看它有多牛逼

点关注公众号&#xff0c;回复“1024”获取2TB学习资源&#xff01; 市面上笔记软件五花八门&#xff0c;都各有特色。wolai、语雀、飞书、印象笔记、石墨、幕布、为知笔记.....等等&#xff0c;数不胜数&#xff0c;但我最终选择了notion&#xff0c;因为它实在太好用了&#…