UNPKG

4.42 kBJavaScriptView Raw
1import { __read, __spreadArray } from "tslib";
2import { EventEmitter } from 'eventemitter3';
3import { CustomEvent } from './CustomEvent';
4import { FederatedEvent } from './FederatedEvent';
5import { isFunction, isBoolean, isObject } from '../utils';
6export var DELEGATION_SPLITTER = ':';
7/**
8 * Objects that can receive events and may have listeners for them.
9 * eg. Element, Canvas, DisplayObject
10 * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget
11 */
12
13var EventTarget =
14/** @class */
15function () {
16 function EventTarget() {
17 /**
18 * event emitter
19 */
20 this.emitter = new EventEmitter();
21 }
22 /**
23 * @deprecated
24 * @alias addEventListener
25 */
26
27
28 EventTarget.prototype.on = function (type, listener, options) {
29 this.addEventListener(type, listener, options);
30 return this;
31 };
32 /**
33 * support `capture` & `once` in options
34 * @see https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener
35 */
36
37
38 EventTarget.prototype.addEventListener = function (type, listener, options) {
39 var capture = isBoolean(options) && options || isObject(options) && options.capture;
40 var once = isObject(options) && options.once;
41 var context = isFunction(listener) ? undefined : listener; // compatible with G 3.0
42 // support using delegate name in event type, eg. 'node:click'
43
44 var useDelegatedName = false;
45 var delegatedName = '';
46
47 if (type.indexOf(DELEGATION_SPLITTER) > -1) {
48 var _a = __read(type.split(DELEGATION_SPLITTER), 2),
49 name_1 = _a[0],
50 eventType = _a[1];
51
52 type = eventType;
53 delegatedName = name_1;
54 useDelegatedName = true;
55 }
56
57 type = capture ? "".concat(type, "capture") : type;
58 listener = isFunction(listener) ? listener : listener.handleEvent; // compatible with G 3.0
59
60 if (useDelegatedName) {
61 var originListener_1 = listener;
62
63 listener = function listener() {
64 var _a;
65
66 var args = [];
67
68 for (var _i = 0; _i < arguments.length; _i++) {
69 args[_i] = arguments[_i];
70 }
71
72 if (((_a = args[0].target) === null || _a === void 0 ? void 0 : _a.name) !== delegatedName) {
73 return;
74 } // @ts-ignore
75
76
77 originListener_1.apply(void 0, __spreadArray([], __read(args), false));
78 };
79 }
80
81 if (once) {
82 this.emitter.once(type, listener, context);
83 } else {
84 this.emitter.on(type, listener, context);
85 }
86
87 return this;
88 };
89 /**
90 * @deprecated
91 * @alias removeEventListener
92 */
93
94
95 EventTarget.prototype.off = function (type, listener, options) {
96 if (type) {
97 this.removeEventListener(type, listener, options);
98 } else {
99 // remove all listeners
100 this.removeAllEventListeners();
101 }
102
103 return this;
104 };
105
106 EventTarget.prototype.removeAllEventListeners = function () {
107 this.emitter.removeAllListeners();
108 };
109
110 EventTarget.prototype.removeEventListener = function (type, listener, options) {
111 var capture = isBoolean(options) && options || isObject(options) && options.capture;
112 var context = isFunction(listener) ? undefined : listener;
113 type = capture ? "".concat(type, "capture") : type;
114 listener = isFunction(listener) ? listener : listener === null || listener === void 0 ? void 0 : listener.handleEvent;
115 this.emitter.off(type, listener, context);
116 return this;
117 };
118 /**
119 * @deprecated
120 * @alias dispatchEvent
121 */
122 // eslint-disable-next-line @typescript-eslint/ban-types
123
124
125 EventTarget.prototype.emit = function (eventName, object) {
126 this.dispatchEvent(new CustomEvent(eventName, object));
127 };
128 /**
129 * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent
130 */
131
132
133 EventTarget.prototype.dispatchEvent = function (e) {
134 var _a, _b;
135
136 if (!(e instanceof FederatedEvent)) {
137 throw new Error('DisplayObject cannot propagate events outside of the Federated Events API');
138 }
139
140 var document = // @ts-ignore
141 this.ownerDocument || this.document; // assign event manager
142
143 if (document) {
144 e.manager = ((_a = document.defaultView) === null || _a === void 0 ? void 0 : _a.getEventService()) || null;
145 e.defaultPrevented = false;
146 e.path = [];
147 e.target = this;
148 (_b = e.manager) === null || _b === void 0 ? void 0 : _b.dispatchEvent(e);
149 }
150
151 return !e.defaultPrevented;
152 };
153
154 return EventTarget;
155}();
156
157export { EventTarget };
\No newline at end of file