//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控制执行一次
    }
}

转载于:https://www.cnblogs.com/ninefrom/p/10875860.html

Event自定义事件相关推荐

  1. Event事件-6:new Event自定义事件 / addEvent绑定自定义 / trigger触发自定义 / removeEvent移除自定义

    new Event 自定义事件 new Event(typeArg, eventInit) typeArg 事件名称 eventInit "bubbles",可选,Boolean类 ...

  2. UE4 虚幻引擎,蓝图Custom Event自定义事件,Call In Editor 在编辑器中调用

    1.在Blueprint蓝图中,Custom Event自定义事件的Details细节面板中,打开Call In Editor编辑器中调用. 2.在Map关卡中的的Details细节面板,就可以直接点 ...

  3. Qt 自定义事件的实现

    初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢?看了篇文章,说先要子类化QEvent,然后定义自己的QEvent::Type,然后重写QWidget::event ...

  4. 自定义事件详解以及实现有趣B站直播间弹幕轰炸功能

    案例:B站直播间弹幕轰炸跳过按键监听办法: var event = document.createEvent('Event'); event.initEvent('input', true, true ...

  5. 初始化触发点击事件_【Vue原理】Event - 源码版 之 自定义事件

    专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版本[2.5.17] Vue 的自定义事件很简单,就是使用 观察者模 ...

  6. python自定义事件event的含义_事件Event详解

    简介 事件模型很多编程语言中都有广泛的应用,在饥荒中也一样.许多component在执行一些核心函数时都会顺带触发事件,比如combat在攻击到目标是就会触发onhitother事件.这时候如果监听该 ...

  7. js事件Event对象(自定义事件对象 CustomEvent)

    文章目录 一.参考 二.Event 接口介绍 2.1 事件分类 三. 创建过时Event不推荐 3.1 document.createEvent 3.1.1 语法`var event = docume ...

  8. cocos2d-js 自定义事件监听派发

    熟悉js的dom事件或者flash事件的,基本都能立马明白cc.eventManager的用法. cc.eventManager有两种注册监听器的方式,一种是原生事件,例如 cc.eventManag ...

  9. Javascript框架的自定义事件(转)

    很多 javascript 框架都提供了自定义事件(custom events),例如 jquery.yui 以及 dojo 都支持"document ready"事件.而部分自定 ...

最新文章

  1. 介绍 Saltstack批量管理文件和计划任务
  2. oracle数据连接出现 login denied 问题
  3. C语言程序设计0004,C语言程序设计0004.doc
  4. Evernote,有道云笔记以及Ms Onenote 2011
  5. react之虚拟DOM的两种创建方式
  6. 线程池选择使用的hash算法
  7. 如何在geth中创建genesis.json_Adobe XD 入门教程-如何在 Adobe XD 中创建交互式原型?...
  8. 4乘4方格走的路线_国庆自驾游,4条成都出发沿途美景大汇合自驾游路线推荐
  9. FlutterFragment 踩坑记
  10. Gradle Maven部署,转化
  11. js opener 的使用
  12. JDBC更新10W级以上数据性能优化
  13. centos 7 安装pip
  14. at24c08 E2PROM的I2C设备驱动实例——基于mini2440
  15. wow工程修理机器人图纸_魔兽世界修理机器人-魔兽世界工程修理机器人图纸哪有啊?魔兽世界 – 手机爱问...
  16. 颗粒物检测仪常用的三种检测方法
  17. 4k显示服务器,远程服务器4k显示器
  18. java 余弦定理_文本相似度计算之余弦定理
  19. 【人工智能】云边融合的AI Cloud 不是简单的“云+边”
  20. Spring Cloud之初入篇

热门文章

  1. PostgreSQL运维实战精讲之“postgresql源码安装”
  2. 团队项目—每日记录3(补4.25)
  3. ActiveMQ 消息服务(一)
  4. 需要恢复中断状态的一个场景
  5. c#操作Excel整理总结
  6. MySQL中更改表操作
  7. linux tc打造ip流量限制
  8. Linux01-基本操作与Shell
  9. pytorch与keras_Keras vs PyTorch:如何通过迁移学习区分外星人与掠食者
  10. git隐藏修改_您可能不知道的有关Git隐藏的有用技巧