<menuitem id="mv7mv"><ins id="mv7mv"></ins></menuitem>

<samp id="mv7mv"><ins id="mv7mv"><u id="mv7mv"></u></ins></samp>

    1. <progress id="mv7mv"></progress>

        <tbody id="mv7mv"></tbody>
        您所在的位置:主頁 > 西安汽車展 > 企業 > 正文

        原生JS封裝拖動驗證滑塊你會嗎?「實踐」

        2020-09-26 04:45:05 來源: 閱讀:-


        原生JS封裝拖動驗證滑塊你會嗎?「實踐」

        作者:_release

        轉發鏈接:https://juejin.im/post/5ed37a73e51d45788c739784

        前言

        星期六閑著沒事,就想著寫寫原生js玩玩,在網上看了幾個效果后決定做這個效果,并且使用了prototype和eventEmitter封裝成了庫。

        最終效果


        原生JS封裝拖動驗證滑塊你會嗎?「實踐」


        分析

        看到這個效果我們首先應該想到和拖動有關的api: onmousedown, onmousemove, onmouseup

        其次要支持用戶傳入放置這個組件的dom元素和完成的回調事件。

        最終如何使用?

        我們先來看下使用方式,再來決定我們怎么編寫這個庫


        原生JS封裝拖動驗證滑塊你會嗎?「實踐」


        具體使用就是這樣的,我們還想用戶能通過import等方式使用,所以我們就要支持esMoudule的導入方式。

        編寫庫的整體初始框架

        (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) { //IE
        var 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繼承emitter

        proto.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聲明了一個對象SliderTools,將用戶傳進來的option和默認的defaultOption進行合并

        編寫核心函數1(創建dom和css)

        proto.createSlider = function () {
        this.options.el.innerHTML = '
        拖動滑塊驗證
        ';//像指定元素中放置插件的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) { //IE
        var 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 = '
        拖動滑塊驗證
        ';
        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 = null
        self.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('驗證完成');
        })

        推薦JavaScript經典實例學習資料文章

        如何實現高性能的在線 PDF 預覽

        細說使用字體庫加密數據-仿58同城

        Node.js要完了嗎?

        Pug 3.0.0正式發布,不再支持 Node.js 6/8

        純JS手寫輪播圖(代碼邏輯清晰,通俗易懂)

        JavaScript 20 年 中文版之創立標準

        值得收藏的前端常用60余種工具方法「JS篇」

        箭頭函數和常規函數之間的 5 個區別

        通過發布/訂閱的設計模式搞懂 Node.js 核心模塊 Events

        「前端篇」不再為正則煩惱

        「速圍」Node.js V14.3.0 發布支持頂級 Await 和 REPL 增強功能

        深入細品瀏覽器原理「流程圖」

        JavaScript 已進入第三個時代,未來將何去何從?

        前端上傳前預覽文件 image、text、json、video、audio「實踐」

        深入細品 EventLoop 和瀏覽器渲染、幀動畫、空閑回調的關系

        推薦13個有用的JavaScript數組技巧「值得收藏」

        前端必備基礎知識:window.location 詳解

        不要再依賴CommonJS了

        犀牛書作者:最該忘記的JavaScript特性

        36個工作中常用的JavaScript函數片段「值得收藏」

        Node + H5 實現大文件分片上傳、斷點續傳

        一文了解文件上傳全過程(1.8w字深度解析)「前端進階必備」

        【實踐總結】關于小程序掙脫枷鎖實現批量上傳

        手把手教你前端的各種文件上傳攻略和大文件斷點續傳

        字節跳動面試官:請你實現一個大文件上傳和斷點續傳

        談談前端關于文件上傳下載那些事【實踐】

        手把手教你如何編寫一個前端圖片壓縮、方向糾正、預覽、上傳插件

        最全的 JavaScript 模塊化方案和工具

        「前端進階」JS中的內存管理

        JavaScript正則深入以及10個非常有意思的正則實戰

        前端面試者經常忽視的一道JavaScript 面試題

        一行JS代碼實現一個簡單的模板字符串替換「實踐」

        JS代碼是如何被壓縮的「前端高級進階」

        前端開發規范:命名規范、html規范、css規范、js規范

        【規范篇】前端團隊代碼規范最佳實踐

        100個原生JavaScript代碼片段知識點詳細匯總【實踐】

        關于前端174道 JavaScript知識點匯總(一)

        關于前端174道 JavaScript知識點匯總(二)

        關于前端174道 JavaScript知識點匯總(三)

        幾個非常有意思的javascript知識點總結【實踐】

        都2020年了,你還不會JavaScript 裝飾器?

        JavaScript實現圖片合成下載

        70個JavaScript知識點詳細總結(上)【實踐】

        70個JavaScript知識點詳細總結(下)【實踐】

        開源了一個 JavaScript 版敏感詞過濾庫

        送你 43 道 JavaScript 面試題

        3個很棒的小眾JavaScript庫,你值得擁有

        手把手教你深入鞏固JavaScript知識體系【思維導圖】

        推薦7個很棒的JavaScript產品步驟引導庫

        Echa哥教你徹底弄懂 JavaScript 執行機制

        一個合格的中級前端工程師需要掌握的 28 個 JavaScript 技巧

        深入解析高頻項目中運用到的知識點匯總【JS篇】

        JavaScript 工具函數大全【新】

        從JavaScript中看設計模式(總結)

        身份證號碼的正則表達式及驗證詳解(JavaScript,Regex)

        瀏覽器中實現JavaScript計時器的4種創新方式

        Three.js 動效方案

        手把手教你常用的59個JS類方法

        127個常用的JS代碼片段,每段代碼花30秒就能看懂-【上】

        深入淺出講解 js 深拷貝 vs 淺拷貝

        手把手教你JS開發H5游戲【消滅星星】

        深入淺出講解JS中this/apply/call/bind巧妙用法【實踐】

        手把手教你全方位解讀JS中this真正含義【實踐】

        書到用時方恨少,一大波JS開發工具函數來了

        干貨滿滿!如何優雅簡潔地實現時鐘翻牌器(支持JS/Vue/React)

        手把手教你JS 異步編程六種方案【實踐】

        讓你減少加班的15條高效JS技巧知識點匯總【實踐】

        手把手教你JS開發H5游戲【黃金礦工】

        手把手教你JS實現監控瀏覽器上下左右滾動

        JS 經典實例知識點整理匯總【實踐】

        2.6萬字JS干貨分享,帶你領略前端魅力【基礎篇】

        2.6萬字JS干貨分享,帶你領略前端魅力【實踐篇】

        簡單幾步讓你的 JS 寫得更漂亮

        恭喜你獲得治療JS this的詳細藥方

        談談前端關于文件上傳下載那些事【實踐】

        面試中教你繞過關于 JavaScript 作用域的 5 個坑

        Jquery插件(常用的插件庫)

        【JS】如何防止重復發送ajax請求

        JavaScript+Canvas實現自定義畫板

        Continuation 在 JS 中的應用「前端篇」


        作者:_release
        轉發鏈接:https://juejin.im/post/5ed37a73e51d45788c739784

        推薦閱讀:桂林網訊

        国产精品亚洲综合久久