How to use JavaScript EventTarget?

前端 未结 10 1801
一生所求
一生所求 2020-12-01 03:53

I would like to create a custom event emitter in my client-side programs. I am referencing this (sparse) documentation for EventTarget

My implementation atte

10条回答
  •  春和景丽
    2020-12-01 04:10

    Try my simple ES6 implemetation.

    class DOMEventTarget {
      constructor() {
        this.listeners = new Map();
      }
      addEventListener(type, listener) {
        this.listeners.set(listener.bind(this), {
          type, listener
        });
      }
      removeEventListener(type, listener) {
        for(let [key, value] of this.listeners){
          if(value.type !== type || listener !== value.listener){
            continue;
          }
          this.listeners.delete(key);
        }
      }
      dispatchEvent(event) {
        Object.defineProperty(event, 'target',{value: this});
        this['on' + event.type] && this['on' + event.type](event);
        for (let [key, value] of this.listeners) {
          if (value.type !== event.type) {
            continue;
          }
          key(event);
        }
      }
    }
    
    let eventEmitter = new DOMEventTarget();
    eventEmitter.addEventListener('test', e => {
      console.log('addEventListener works');
    });
    eventEmitter.ontest = e => console.log('ontype works');
    eventEmitter.dispatchEvent(new Event('test'));

提交回复
热议问题