Avoid creating event object when nobody is listening

This commit is contained in:
Maximilian Krög
2022-02-09 21:03:11 +01:00
parent 96de98bfbb
commit d35d1cc8ad

View File

@@ -83,15 +83,17 @@ class Target extends Disposable {
* @api * @api
*/ */
dispatchEvent(event) { dispatchEvent(event) {
/** @type {import("./Event.js").default|Event} */ const isString = typeof event === 'string';
const evt = typeof event === 'string' ? new Event(event) : event; const type = isString ? event : event.type;
const type = evt.type; const listeners = this.listeners_ && this.listeners_[type];
if (!listeners) {
return;
}
const evt = isString ? new Event(event) : /** @type {Event} */ (event);
if (!evt.target) { if (!evt.target) {
evt.target = this.eventTarget_ || this; evt.target = this.eventTarget_ || this;
} }
const listeners = this.listeners_ && this.listeners_[type];
let propagate;
if (listeners) {
const dispatching = this.dispatching_ || (this.dispatching_ = {}); const dispatching = this.dispatching_ || (this.dispatching_ = {});
const pendingRemovals = const pendingRemovals =
this.pendingRemovals_ || (this.pendingRemovals_ = {}); this.pendingRemovals_ || (this.pendingRemovals_ = {});
@@ -100,6 +102,7 @@ class Target extends Disposable {
pendingRemovals[type] = 0; pendingRemovals[type] = 0;
} }
++dispatching[type]; ++dispatching[type];
let propagate;
for (let i = 0, ii = listeners.length; i < ii; ++i) { for (let i = 0, ii = listeners.length; i < ii; ++i) {
if ('handleEvent' in listeners[i]) { if ('handleEvent' in listeners[i]) {
propagate = /** @type {import("../events.js").ListenerObject} */ ( propagate = /** @type {import("../events.js").ListenerObject} */ (
@@ -115,8 +118,7 @@ class Target extends Disposable {
break; break;
} }
} }
--dispatching[type]; if (--dispatching[type] === 0) {
if (dispatching[type] === 0) {
let pr = pendingRemovals[type]; let pr = pendingRemovals[type];
delete pendingRemovals[type]; delete pendingRemovals[type];
while (pr--) { while (pr--) {
@@ -126,7 +128,6 @@ class Target extends Disposable {
} }
return propagate; return propagate;
} }
}
/** /**
* Clean up. * Clean up.