How to use JavaScript EventTarget?

前端 未结 10 1824
一生所求
一生所求 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:15

    I gave up on this awhile ago, but recently needed it again. Here's what I ended up using.

    ES6

    class Emitter {
      constructor() {
        var delegate = document.createDocumentFragment();
        [
          'addEventListener',
          'dispatchEvent',
          'removeEventListener'
        ].forEach(f =>
          this[f] = (...xs) => delegate[f](...xs)
        )
      }
    }
    
    // sample class to use Emitter
    class Example extends Emitter {}
    
    // run it
    var e = new Example()
    e.addEventListener('something', event => console.log(event))
    e.dispatchEvent(new Event('something'))


    ES5

    function Emitter() {
      var eventTarget = document.createDocumentFragment()
    
      function delegate(method) {
        this[method] = eventTarget[method].bind(eventTarget)
      }
    
      [
        "addEventListener",
        "dispatchEvent",
        "removeEventListener"
      ].forEach(delegate, this)
    }
    
    // sample class to use it
    function Example() {
      Emitter.call(this)
    }
    
    // run it
    var e = new Example()
    
    e.addEventListener("something", function(event) {
      console.log(event)
    })
    
    e.dispatchEvent(new Event("something"))

    Yeah!


    For those that need to support older versions of ecmascript, here you go

    // IE < 9 compatible
    function Emitter() {
      var eventTarget = document.createDocumentFragment();
    
      function addEventListener(type, listener, useCapture, wantsUntrusted) {
        return eventTarget.addEventListener(type, listener, useCapture, wantsUntrusted);
      }
    
      function dispatchEvent(event) {
        return eventTarget.dispatchEvent(event);
      }
    
      function removeEventListener(type, listener, useCapture) {
        return eventTarget.removeEventListener(type, listener, useCapture);
      }
    
      this.addEventListener = addEventListener;
      this.dispatchEvent = dispatchEvent;
      this.removeEventListener = removeEventListener;
    }
    

    The usage stays the same

提交回复
热议问题