ListenerHandler.class.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. export default class ListenerHandler extends EventTarget {
  2. constructor() {
  3. super();
  4. this.listeners = {};
  5. }
  6. addEventListener(type, cb, options) {
  7. // add the listener type to listeners object
  8. if (!(type in this.listeners)) this.listeners[type] = [];
  9. const stack = this.listeners[type];
  10. // push the callback
  11. stack.push({ cb, options });
  12. const replaceableIndexes = [];
  13. // check for any replaceable callbacks
  14. stack.forEach((element, index) => {
  15. if (element.options && element.options.replaceable)
  16. replaceableIndexes.push(index);
  17. });
  18. // should always be 1 replaceable callback remaining
  19. replaceableIndexes.pop();
  20. // delete the other replaceable callbacks
  21. replaceableIndexes.forEach(index => stack.splice(index, 1));
  22. }
  23. // eslint-disable-next-line consistent-return
  24. removeEventListener(type, cb) {
  25. if (!(type in this.listeners)) return true; // event type doesn't exist
  26. const stack = this.listeners[type];
  27. stack.forEach((element, index) => {
  28. if (element.cb === cb) stack.splice(index, 1);
  29. });
  30. }
  31. dispatchEvent(event) {
  32. if (!(event.type in this.listeners)) return true; // event type doesn't exist
  33. const stack = this.listeners[event.type].slice();
  34. stack.forEach(element => element.cb.call(this, event));
  35. return !event.defaultPrevented;
  36. }
  37. }