码迷,mamicode.com
首页 > Web开发 > 详细

自定义事件 js

时间:2018-02-06 14:22:55      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:ret   nts   his   dispatch   事件   remove   触发事件   删除   ons   

// 原理如下
// 创建 类型为HTMLEvents的事件 var evt = document.createEvent("HTMLEvents"); // 初始化 自定义eee 事件 evt.initEvent("eee", false, false);
// 事件绑定
document.addEventListener("eee", function(e) { console.log(e) })

// document标签触发事件(直接运行代码触发)
document.dispatchEvent(evt);

这儿无法传参,再做一个封装。

    class EventEmitter {
        constructor() {
            this.evt = document.createEvent("HTMLEvents")

        }
        on(type, fn) {
            this.evt.initEvent(type, false, false);
            document.addEventListener(type, () => {
                fn(this.data)
            }, false)
        }
        emit(type, data) {
            this.data = data
            document.dispatchEvent(this.evt)
        }
    }
    const evt = new EventEmitter()
    evt.on(‘abc‘, (data) => {
        console.log(data) // {a: 1}
    })
    evt.emit(‘abc‘, { a: 1 })

 还有问题, 没法绑定多个事件,这只要做一个map记录就行了

// 如下   
 class EventEmitter {

        constructor() {
            // 统计事件map
            this.evts = new Map
        }
        // 注册事件
        on(type, fn) {
            let evt = document.createEvent("HTMLEvents")
            evt.initEvent(type, false, false)

            this.evts.set(type, { evt, fn })

            document.addEventListener(type, () => fn(this.data), false)
        }
        // 触发事件
        emit(type, data) {
            if (!this.evts.has(type)) {
                return false
            }

            this.data = data

            document.dispatchEvent(this.evts.get(type).evt)
        }
        // 删除事件
        remove(type) {
            document.removeEventListener(type, this.evts.get(type).fn, false)
            this.evts.delete(type)
        }
    }
    const evt = new EventEmitter()
    evt.on(‘abc‘, (data) => {
        console.log(‘abc‘, data)
    })
    evt.on(‘aaa‘, (data) => {
        console.log(‘aaa‘, data)
    })
    evt.emit(‘aaa‘, { aaa: 1 }) // aaa {aaa: 1}
    evt.emit(‘abc‘, { a: 1 })  //abc {a: 1}  
    evt.emit(‘abc‘, { ddf: 1 }) //abc { ddf: 1 }
   evt.emit(‘ffg‘, { ddd: 1 })  // 无打印
  evt.remove(
‘abc‘) // 删除
   evt.emit(
‘abc‘, 111) // 无打印 

 

自定义事件 js

标签:ret   nts   his   dispatch   事件   remove   触发事件   删除   ons   

原文地址:https://www.cnblogs.com/gsgs/p/8421711.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!