diff --git a/src/ol/events/Target.js b/src/ol/events/Target.js index d2cb33c5b1..26a0395518 100644 --- a/src/ol/events/Target.js +++ b/src/ol/events/Target.js @@ -83,49 +83,50 @@ class Target extends Disposable { * @api */ dispatchEvent(event) { - /** @type {import("./Event.js").default|Event} */ - const evt = typeof event === 'string' ? new Event(event) : event; - const type = evt.type; + const isString = typeof event === 'string'; + const type = isString ? event : event.type; + const listeners = this.listeners_ && this.listeners_[type]; + if (!listeners) { + return; + } + + const evt = isString ? new Event(event) : /** @type {Event} */ (event); if (!evt.target) { evt.target = this.eventTarget_ || this; } - const listeners = this.listeners_ && this.listeners_[type]; - let propagate; - if (listeners) { - const dispatching = this.dispatching_ || (this.dispatching_ = {}); - const pendingRemovals = - this.pendingRemovals_ || (this.pendingRemovals_ = {}); - if (!(type in dispatching)) { - dispatching[type] = 0; - pendingRemovals[type] = 0; - } - ++dispatching[type]; - for (let i = 0, ii = listeners.length; i < ii; ++i) { - if ('handleEvent' in listeners[i]) { - propagate = /** @type {import("../events.js").ListenerObject} */ ( - listeners[i] - ).handleEvent(evt); - } else { - propagate = /** @type {import("../events.js").ListenerFunction} */ ( - listeners[i] - ).call(this, evt); - } - if (propagate === false || evt.propagationStopped) { - propagate = false; - break; - } - } - --dispatching[type]; - if (dispatching[type] === 0) { - let pr = pendingRemovals[type]; - delete pendingRemovals[type]; - while (pr--) { - this.removeEventListener(type, VOID); - } - delete dispatching[type]; - } - return propagate; + const dispatching = this.dispatching_ || (this.dispatching_ = {}); + const pendingRemovals = + this.pendingRemovals_ || (this.pendingRemovals_ = {}); + if (!(type in dispatching)) { + dispatching[type] = 0; + pendingRemovals[type] = 0; } + ++dispatching[type]; + let propagate; + for (let i = 0, ii = listeners.length; i < ii; ++i) { + if ('handleEvent' in listeners[i]) { + propagate = /** @type {import("../events.js").ListenerObject} */ ( + listeners[i] + ).handleEvent(evt); + } else { + propagate = /** @type {import("../events.js").ListenerFunction} */ ( + listeners[i] + ).call(this, evt); + } + if (propagate === false || evt.propagationStopped) { + propagate = false; + break; + } + } + if (--dispatching[type] === 0) { + let pr = pendingRemovals[type]; + delete pendingRemovals[type]; + while (pr--) { + this.removeEventListener(type, VOID); + } + delete dispatching[type]; + } + return propagate; } /**