events-emitter.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /* eslint-disable no-underscore-dangle */
  2. export default {
  3. on(events, handler, priority) {
  4. const self = this;
  5. if (typeof handler !== 'function') return self;
  6. const method = priority ? 'unshift' : 'push';
  7. events.split(' ').forEach(event => {
  8. if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
  9. self.eventsListeners[event][method](handler);
  10. });
  11. return self;
  12. },
  13. once(events, handler, priority) {
  14. const self = this;
  15. if (typeof handler !== 'function') return self;
  16. function onceHandler() {
  17. self.off(events, onceHandler);
  18. if (onceHandler.__emitterProxy) {
  19. delete onceHandler.__emitterProxy;
  20. }
  21. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  22. args[_key] = arguments[_key];
  23. }
  24. handler.apply(self, args);
  25. }
  26. onceHandler.__emitterProxy = handler;
  27. return self.on(events, onceHandler, priority);
  28. },
  29. onAny(handler, priority) {
  30. const self = this;
  31. if (typeof handler !== 'function') return self;
  32. const method = priority ? 'unshift' : 'push';
  33. if (self.eventsAnyListeners.indexOf(handler) < 0) {
  34. self.eventsAnyListeners[method](handler);
  35. }
  36. return self;
  37. },
  38. offAny(handler) {
  39. const self = this;
  40. if (!self.eventsAnyListeners) return self;
  41. const index = self.eventsAnyListeners.indexOf(handler);
  42. if (index >= 0) {
  43. self.eventsAnyListeners.splice(index, 1);
  44. }
  45. return self;
  46. },
  47. off(events, handler) {
  48. const self = this;
  49. if (!self.eventsListeners) return self;
  50. events.split(' ').forEach(event => {
  51. if (typeof handler === 'undefined') {
  52. self.eventsListeners[event] = [];
  53. } else if (self.eventsListeners[event]) {
  54. self.eventsListeners[event].forEach((eventHandler, index) => {
  55. if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
  56. self.eventsListeners[event].splice(index, 1);
  57. }
  58. });
  59. }
  60. });
  61. return self;
  62. },
  63. emit() {
  64. const self = this;
  65. if (!self.eventsListeners) return self;
  66. let events;
  67. let data;
  68. let context;
  69. for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
  70. args[_key2] = arguments[_key2];
  71. }
  72. if (typeof args[0] === 'string' || Array.isArray(args[0])) {
  73. events = args[0];
  74. data = args.slice(1, args.length);
  75. context = self;
  76. } else {
  77. events = args[0].events;
  78. data = args[0].data;
  79. context = args[0].context || self;
  80. }
  81. data.unshift(context);
  82. const eventsArray = Array.isArray(events) ? events : events.split(' ');
  83. eventsArray.forEach(event => {
  84. if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
  85. self.eventsAnyListeners.forEach(eventHandler => {
  86. eventHandler.apply(context, [event, ...data]);
  87. });
  88. }
  89. if (self.eventsListeners && self.eventsListeners[event]) {
  90. self.eventsListeners[event].forEach(eventHandler => {
  91. eventHandler.apply(context, data);
  92. });
  93. }
  94. });
  95. return self;
  96. }
  97. };