easy-event

easy-event 是一个简单易用的事件模块。提供了3个类:Event、EventDispatcher 和 EventCenter。

Usage no npm install needed!

<script type="module">
  import easyEvent from 'https://cdn.skypack.dev/easy-event';
</script>

README

easy-event

easy-event 是一个简单易用的事件模块。提供了3个类:EventEventDispatcherEventCenter

Event 类作为创建事件实例的基类,当发生事件时,Event 对象将作为参数传递给事件侦听器。Event 类的属性包含有关事件的基本信息。

EventDispatcher 是事件派发器类,负责进行事件的发送和侦听。通常,用户定义的类能够调度事件的最简单方法是扩展 EventDispatcher

EventCenter 是一个全局的事件监听器,调用它的静态方法 EventCenter.register() 注册事件,然后可以在代码的任何地方调用 EventCenter.send() 派发事件。这种方式派发事件非常灵活,但是不便于日后的维护,一般用于监听系统的全局事件。

Install

npm i easy-event

Demo

const {Event, EventDispatcher, EventCenter} = require('./easy-event');


class Main {
    constructor() {

        let loader = new Loader();

        loader.once(Event.OPEN, (event) => {
            console.log("------- open -------");
            console.log("loader has Event.OPEN:" + loader.hasEventListener(Event.OPEN));
        }, this);

        loader.addEventListener(Event.COMPLETE, this.onComplete1, this);
        loader.addEventListener(Event.COMPLETE, this.onComplete2, this, 100);

        // 用 EventCenter 可以全局监听
        EventCenter.register(Event.CHANGE, this.onChange, this);

        loader.open();
        loader.load("a.jpg");
        loader.change();
    }

    onComplete1(event) {
        console.log("------- onComplete1 -------");

        let loader = event.target;

        console.log("event.target:" + loader.toString());
        console.log("event.type:" + event.type.toString());
        console.log("event.data:" + `size:${event.data.size} path:${event.data.path}`);

        console.log("loader has Event.COMPLETE:" + loader.hasEventListener(Event.COMPLETE));
        //移除监听器
        loader.removeEventListener(Event.COMPLETE, this.onComplete1);
        console.log("loader has Event.COMPLETE:" + loader.hasEventListener(Event.COMPLETE));
    }

    onComplete2(event) {
        console.log("------- onComplete2 --------");
        console.log("优先级被提高");
        //移除监听器
        event.target.removeEventListener(Event.COMPLETE, this.onComplete2);
    }

    onChange(event) {
        console.log("------- onChange -------");
        console.log("这是来自 EventCenter 派发的事件")
    }
}

/**
 * 创建一个EventDispatcher的子类,模拟加载器。
 * 当加调用load()方法时,延迟一段时间会派发Event.COMPLETE事件
 */
class Loader extends EventDispatcher {

    open() {
        this.dispatchEvent(new Event(Event.OPEN));
    }

    // 模拟异步加载
    load(path) {

        let self = this;

        setTimeout(() => {
            //加载完成,将加载数据封装为Event对象,派发出去。
            let evt = new Event(Event.COMPLETE, {path: path, size: '10KB'});
            self.dispatchEvent(evt);

        }, 2000);
    }

    change() {
        EventCenter.send(new Event(Event.CHANGE), this);
    }

    toString() {
        return "My name is Loader ~~";
    }
}

new Main();

Output

------- open -------
loader has Event.OPEN:false
------- onChange -------
这是来自 EventCenter 派发的事件
------- onComplete2 --------
优先级被提高
------- onComplete1 -------
event.target:My name is Loader ~~
event.type:Symbol(COMPLETE)
event.data:size:10KB path:a.jpg
loader has Event.COMPLETE:true
loader has Event.COMPLETE:false

API

Event

Event 类作为创建事件实例的基类,当发生事件时,Event 实例将作为参数传递给事件侦听器。Event 类的属性包含有关事件的基本信息。您可以通过扩展 Event 类,将此类其他信息传递给事件侦听器。

公共属性

属性 类型 说明
type string [只读] 事件的类型
target object [只读] 事件目标
data object 与此事件对象关联的可选数据

公共方法

方法
Event ( type :string, data ? :object ) : Event
创建一个作为参数传递给事件侦听器的 Event 对象
clone() : Event
复制该对象
toString() : string
转换为字符串
create(EventClass : 'class', type : 'string', data ? :object) : Event
[静态] 从对象池中取出或创建一个新的事件实例
release(event : 'Event') : void
[静态] 释放一个事件对象,并缓存到对象池

EventDispatcher

EventDispatcher 是事件派发器类,负责进行事件的发送和侦听。通常,用户定义的类能够调度事件的最简单方法是扩展 EventDispatcher。如果无法扩展(即,如果该类已经扩展了另一个类),则可以创建 EventDispatcher 成员,并编写一些简单的映射,将调用连接到聚合的 EventDispatcher 中。

公共方法

方法
EventDispatcher ( target ? :object ) : EventDispatcher
创建一个 EventDispatcher 类的实例
addEventListener ( type :string, listener :function, thisObj ? :object, priority ? :number ) : void
使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知
dispatchEvent ( event : Event ) : void
派发事件
dispatchEventWith ( type :string , data ? : object ) : void
派发一个指定参数的事件
hasEventListener ( type :string ) : boolean
检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器
once ( type :string, listener :function, thisObj ? :object, priority ? :number ) : void
添加仅回调一次的事件侦听器,此方法与addEventListener()方法不同,addEventListener()方法会持续产生回调,而此方法在第一次回调时就会自动移除监听
removeEventListener ( type :string, listener :function) : void
EventDispatcher 对象中删除侦听器
removeAll () : void
EventDispatcher 对象中删除全部侦听器

EventCenter

EventCenter 是一个全局的事件监听器,调用它的静态方法 EventCenter.register() 注册事件,然后可以在代码的任何地方调用 EventCenter.send() 派发事件。这种方式派发事件非常灵活,但是不便于日后的维护,一般用于监听系统的全局事件。

公共方法

方法
[静态] register ( type :string, listener :function, thisObj ? :object, priority ? :number ) : void
注册事件侦听器对象,以使侦听器能够接收事件通知
[静态] send ( event : Event, target ? :object ) : void
派发事件
[静态] unregister ( type :string, listener :function) : void
删除侦听器

更新日志

版本 更新内容
1.2.0 使用 webpack 打包。
1.1.0 新增 Event.create()Event.release()EventDispatcher.dispatchEventWith() 方法。