自定义实现一个JS事件系统

作者: 夏海峰 | 来源:发表于2019-12-10 10:01 被阅读0次
  • 自定义Event类,它的eventArr属性用于存放所有注册成功的自定义事件,这是一个事件容器。
  • 原型链上的 on() 方法,用于绑定一个自定义事件,这类事件可以被多次触发。
  • 原型链上的 once() 方法,用于绑定只能被触发一次的自定义事件。
  • 原型链上的 off() 方法,用于解绑指定的自定义事件。
  • 原型链上的 emit() 方法,用于触发事件模型中的指定类型的自定义事件。
function Event() {
  this.eventArr = []
}

// on() 方法,用于绑定一个自定义事件
Event.prototype.on = function(eventType, callbackFn) {
  this.eventArr.push({
    eventType,
    callbackFn,
    once: false,
    done: false
  })
}

// once() 方法,用于绑定只能触发一次的自定义事件
Event.prototype.once = function(eventType, callbackFn) {
  this.eventArr.push({
    eventType,
    callbackFn,
    once: true,
    done: false
  })
}

// off() 方法,用于解绑自定义事件
Event.prototype.off = function(eventType, callbackFn) {
  this.eventArr.map((ele,idx)=>{
    if(ele.eventType === eventArr && ele.callbackFn === callbackFn) {
      this.eventArr.splice(idx, 1)
    }
  })
}

// emit() 方法,用于触发事件模型中指定类型的自定义事件
Event.prototype.emit = function(eventType) {
  this.eventArr.map((ele,idx) => {
    if (ele.eventType === eventType) {
      if(!ele.done) {
        ele.callbackFn()
        if(ele.once) {
          this.eventArr[idx].done = true  // 把once注册的事件,标记为“done”
        }
      }
    }
  })
}

测试一下这个自定义的事件系统,测试代码如下:

// 创建事件系统实例
const myEvent = new Event()

function fn1() {
  console.log(1)
}
function fn2() {
  console.log(2)
}
function fn3() {
  console.log(3)
}

// 注册3个 click 事件
myEvent.on('click', fn1)
myEvent.on('click', fn2)
myEvent.once('click', fn3)   // 只会被触发一次

// 注册1个 tap 事件
myEvent.once('tap', fn3)

// 连接两次触发 click事件
myEvent.emit('click')
myEvent.emit('click')

// 连接两次触发 tap事件
myEvent.emit('tap')
myEvent.emit('tap')

本篇结束!!!

相关文章

  • 学习vue2.0笔记(第四章下)

    js实现过渡:通过v-on事件## 实例:最外层index里面引入jq 监听三个事件 自定义事件## 自定义一个v...

  • 自定义实现一个JS事件系统

    自定义Event类,它的eventArr属性用于存放所有注册成功的自定义事件,这是一个事件容器。 原型链上的 on...

  • JavaScript自定义事件和发布订阅模式

    在js和JQuery里都可以自定义事件,在我看来自定义事件的核心就是发布订阅模式的实现。所谓的发布订阅模式是Jav...

  • 自定义事件js

    title: 自定义事件date: 2017-06-06 15:36:04tags: 自定义事件 js的自定义事件...

  • dom事件代理

    实现一个js事件代理的模块,帮助用户快速实现事件代理。

  • IFE2017,动态数据绑定(二)学习笔记

    自定义事件 我们知道JS里绑定事件有addEventListener()这个方法。在JS中我们可以这样创建一个自定...

  • jQuery例子记录(持续更新)

    目录: 1.自定义事件2.操作DOM(与JS原生对比) 1.自定义事件 绑定自定义事件: 事件名称refresh....

  • Jquery总结

    Jquery能实现的JS都能实现,JS实现的Jquery未必能实现 事件 常用的基本事件 鼠标事件mouseent...

  • JS中的事件

    JS中的事件 一:自定义事件 1.使用Event自定义事件 使用Event接口,可以自定义事件。但是该接口无法在事...

  • 十道前端面试题第【03】篇

    摘要:本篇分享了10道面试题——Web性能优化方案、JS严格模式、五道算法题、自定义JS事件系统、输入URL到浏览...

网友评论

    本文标题:自定义实现一个JS事件系统

    本文链接:https://www.haomeiwen.com/subject/nmpwgctx.html