Event自定义事件
//index.html文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> #box{ width: 100px; height: 100px; background-color: red; position: absolute; top: 0; left: 0; } </style> </head> <body> <div id="box"></div> </body> </html> <script src="./event.js"></script> <script> class Drag extends Event{ constructor(el){ super(); this.el = el; //元素 this.startPoint = {}; //起始鼠标位置 this.startEl = {}; //起始元素位置 let move = e => { this.move(e); } let end = (e) => { document.removeEventListener('mousemove',move); document.removeEventListener('mouseup',end); this.end(e); //触发事件 } document.addEventListener('mousedown',e => { this.start(e); this.startPoint = { x : e.clientX, y : e.clientY } this.startEl = { x : this.el.offsetLeft, y : this.el.offsetTop } document.addEventListener('mousemove',move); document.addEventListener('mouseup',end) }) } move(e){ let nowPoint = { x : e.clientX, y : e.clientY } let dix = { x : nowPoint.x - this.startPoint.x, y : nowPoint.y - this.startPoint.y } this.el.style.left = this.startEl.x + dix.x + 'px'; this.el.style.top = this.startEl.y + dix.y + 'px'; } start(e){ this.trigger('dragStart',e,this.el) } end(e){ this.trigger('dragEnd',e,this.el) } } var box = document.getElementById('box'); var drag = new Drag(box); drag.on('dragStart',function(e){ this.style.background = 'yellow'; }) drag.on('dragEnd',function(e){ this.style.background = 'red'; }) </script> //event.js文件 class Event{ constructor(){ this.handlers = {}//记录所有的事件和处理函数 } /** * 添加事件监听 *@param type : 事件类型 @param hander : 处理函数 */ on(type,hander,once = false){ if(!this.handlers[type]){ //判断是否添加了事件函数 this.handlers[type] = [] } if(!this.handlers[type].includes(hander)){ //查看是否重复添加事件函数 this.handlers[type].push(hander); hander.once = once; //给事件函数添加一个once属性 } } /** * 取消事件监听 * @param {*} type * @param {*} hander */ off(type,hander){ if(this.handlers[type]){ if(hander === undefined){ this.handlers[type] = []; }else{ this.handlers[type] = this.handlers[type].filter(item => { return item != hander }) } } } /** * 触发事件监听 * @param {*} type * @param {*} e * @param {*} that */ trigger(type,e,that){ if(this.handlers[type]){ this.handlers[type].forEach(f => { f.call(that,e); if(f.once){ this.off(type,f); //根据once属性取消事件 } }) } } /** * 执行一次 * @param {*} type * @param {*} hander */ once(type,hander){ this.on(type,hander,true); //true控制执行一次 } }