<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          原生JS封裝拖動(dòng)驗(yàn)證滑塊你會(huì)嗎?

          共 1235字,需瀏覽 3分鐘

           ·

          2020-08-05 02:24

          作者:_release
          原文地址:https://juejin.im/post/5ed37a73e51d45788c739784

          前言

          閑著沒事,就想著寫寫原生js玩玩,在網(wǎng)上看了幾個(gè)效果后決定做這個(gè)效果,并且使用了prototype和eventEmitter封裝成了庫(kù)。

          最終效果

          分析

          看到這個(gè)效果我們首先應(yīng)該想到和拖動(dòng)有關(guān)的api: onmousedown, onmousemove, onmouseup

          其次要支持用戶傳入放置這個(gè)組件的dom元素和完成的回調(diào)事件。

          最終如何使用?

          我們先來看下使用方式,再來決定我們?cè)趺淳帉戇@個(gè)庫(kù)

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

          編寫庫(kù)的整體初始框架

          (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?????????????????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'),??//創(chuàng)建一個(gè)style元素
          ????????????????head?=?document.head?||?document.getElementsByTagName('head')[0];?//獲取head元素
          ????????????style.type?=?'text/css';?//這里必須顯示設(shè)置style元素的type屬性為text/css,否則在ie中不起作用
          ????????????if?(style.styleSheet)?{?//IE
          ????????????????var?func?=?function?()?{
          ????????????????????try?{?//防止IE中stylesheet數(shù)量超過限制而發(fā)生錯(cuò)誤
          ????????????????????????style.styleSheet.cssText?=?cssText;
          ????????????????????}?catch?(e)?{

          ????????????????????}
          ????????????????}
          ????????????????//如果當(dāng)前styleSheet還不能用,則放到異步中則行
          ????????????????if?(style.styleSheet.disabled)?{
          ????????????????????setTimeout(func,?10);
          ????????????????}?else?{
          ????????????????????func();
          ????????????????}
          ????????????}?else?{?//w3c
          ????????????????//w3c瀏覽器中只要?jiǎng)?chuàng)建文本節(jié)點(diǎn)插入到style元素中就行了
          ????????????????var?textNode?=?document.createTextNode(cssText);
          ????????????????style.appendChild(textNode);
          ????????????}
          ????????????head.appendChild(style);?//把創(chuàng)建的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?????????????????????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';
          ????????//?不重復(fù)添加事件
          ????????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?????????????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?????????????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;//是否拖動(dòng)到最右側(cè)
          ????}

          ????SliderTools.defaultOptions?=?{
          ????????el:?document.body?//默認(rèn)放到body里
          ????};
          ????
          ????var?proto?=?SliderTools.prototype?=?new?EventEmitter();//SliderTools繼承emitter
          ????
          ????proto.constructor?=?SliderTools;//修正構(gòu)造器

          ????proto.init?=?function?()?{
          ????????this.createSlider();//創(chuàng)建插件所需要的dom元素
          ????????this.getElements();//獲取創(chuàng)建好的元素
          ????}
          ????
          ???//?=================代碼塊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是在判斷是在瀏覽器環(huán)境還是nodeJS環(huán)境,方便代碼三后期使用,代碼塊2聲明了一個(gè)對(duì)象SliderTools,將用戶傳進(jìn)來的option和默認(rèn)的defaultOption進(jìn)行合并

          編寫核心函數(shù)1(創(chuàng)建dom和css)

          proto.createSlider?=?function?()?{
          ????this.options.el.innerHTML?=?'
          拖動(dòng)滑塊驗(yàn)證
          ';//像指定元素中放置插件的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');
          }

          編寫核心函數(shù)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)?{?//拖動(dòng)到了最右側(cè)
          ????????????????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')?//拖動(dòng)完成后的樣式
          ????????????????util.addClass(self.handler,?'handler_ok_bg')////拖動(dòng)完成后的樣式
          ????????????????self.handler.onmousedown?=?null?//防止拖動(dòng)完成后再次拖動(dòng)
          ????????????????self.emit('complete')//emit通知使用者的回調(diào)事件
          ????????????}?else?{
          ????????????????util.setInlineStyle([self.handler],?'left',?0?+?'px');
          ????????????????util.setInlineStyle([self.drag_bg],?'width',?0?+?'px');
          ????????????}
          ????????????document.onmousemove?=?null;
          ????????????document.onmouseup?=?null;
          ????????}
          ????}
          }

          添加工具方法(核心函數(shù)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?????????????selector[i].style[attr]?=?content;
          ????????}
          ????},
          }

          最終完整可運(yùn)行代碼

          (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?????????????????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?????????????????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'),??//創(chuàng)建一個(gè)style元素
          ????????????????head?=?document.head?||?document.getElementsByTagName('head')[0];?//獲取head元素
          ????????????style.type?=?'text/css';?//這里必須顯示設(shè)置style元素的type屬性為text/css,否則在ie中不起作用
          ????????????if?(style.styleSheet)?{?//IE
          ????????????????var?func?=?function?()?{
          ????????????????????try?{?//防止IE中stylesheet數(shù)量超過限制而發(fā)生錯(cuò)誤
          ????????????????????????style.styleSheet.cssText?=?cssText;
          ????????????????????}?catch?(e)?{

          ????????????????????}
          ????????????????}
          ????????????????//如果當(dāng)前styleSheet還不能用,則放到異步中則行
          ????????????????if?(style.styleSheet.disabled)?{
          ????????????????????setTimeout(func,?10);
          ????????????????}?else?{
          ????????????????????func();
          ????????????????}
          ????????????}?else?{?//w3c
          ????????????????//w3c瀏覽器中只要?jiǎng)?chuàng)建文本節(jié)點(diǎn)插入到style元素中就行了
          ????????????????var?textNode?=?document.createTextNode(cssText);
          ????????????????style.appendChild(textNode);
          ????????????}
          ????????????head.appendChild(style);?//把創(chuàng)建的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?????????????????????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';

          ????????//?不重復(fù)添加事件
          ????????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?????????????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?????????????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?=?'
          拖動(dòng)滑塊驗(yàn)證';
          ????????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('驗(yàn)證完成');
          })
          瀏覽 38
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色天堂视频在线观看 | 青青青视频在线 | 亚洲精品久久久久蜜桃 | 国产激情自拍 | 在线观看无码AV |