diff --git a/src/ol/Object.js b/src/ol/Object.js index c5ef7ef757..0ea4a1bfad 100644 --- a/src/ol/Object.js +++ b/src/ol/Object.js @@ -172,9 +172,13 @@ class BaseObject extends Observable { notify(key, oldValue) { let eventType; eventType = `change:${key}`; - this.dispatchEvent(new ObjectEvent(eventType, key, oldValue)); + if (this.hasListener(eventType)) { + this.dispatchEvent(new ObjectEvent(eventType, key, oldValue)); + } eventType = ObjectEventType.PROPERTYCHANGE; - this.dispatchEvent(new ObjectEvent(eventType, key, oldValue)); + if (this.hasListener(eventType)) { + this.dispatchEvent(new ObjectEvent(eventType, key, oldValue)); + } } /** 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; } /** diff --git a/src/ol/source/Image.js b/src/ol/source/Image.js index 7253aca49d..7fe2365584 100644 --- a/src/ol/source/Image.js +++ b/src/ol/source/Image.js @@ -240,27 +240,25 @@ class ImageSource extends Source { */ handleImageChange(event) { const image = /** @type {import("../Image.js").default} */ (event.target); + let type; switch (image.getState()) { case ImageState.LOADING: this.loading = true; - this.dispatchEvent( - new ImageSourceEvent(ImageSourceEventType.IMAGELOADSTART, image) - ); + type = ImageSourceEventType.IMAGELOADSTART; break; case ImageState.LOADED: this.loading = false; - this.dispatchEvent( - new ImageSourceEvent(ImageSourceEventType.IMAGELOADEND, image) - ); + type = ImageSourceEventType.IMAGELOADEND; break; case ImageState.ERROR: this.loading = false; - this.dispatchEvent( - new ImageSourceEvent(ImageSourceEventType.IMAGELOADERROR, image) - ); + type = ImageSourceEventType.IMAGELOADERROR; break; default: - // pass + return; + } + if (this.hasListener(type)) { + this.dispatchEvent(new ImageSourceEvent(type, image)); } } } diff --git a/src/ol/source/Vector.js b/src/ol/source/Vector.js index 84f1ee9e04..aed90d7369 100644 --- a/src/ol/source/Vector.js +++ b/src/ol/source/Vector.js @@ -457,10 +457,12 @@ class VectorSource extends Source { this.featuresRtree_.load(extents, geometryFeatures); } - for (let i = 0, length = newFeatures.length; i < length; i++) { - this.dispatchEvent( - new VectorSourceEvent(VectorEventType.ADDFEATURE, newFeatures[i]) - ); + if (this.hasListener(VectorEventType.ADDFEATURE)) { + for (let i = 0, length = newFeatures.length; i < length; i++) { + this.dispatchEvent( + new VectorSourceEvent(VectorEventType.ADDFEATURE, newFeatures[i]) + ); + } } }