Register and unregister events in set target handler

This commit is contained in:
Andreas Hocevar
2020-07-12 13:13:54 +02:00
parent 5cd102af10
commit 56db05772c

View File

@@ -282,17 +282,13 @@ class PluggableMap extends BaseObject {
* @private * @private
* @type {MapBrowserEventHandler} * @type {MapBrowserEventHandler}
*/ */
this.mapBrowserEventHandler_ = new MapBrowserEventHandler( this.mapBrowserEventHandler_ = null;
this,
options.moveTolerance /**
); * @private
const handleMapBrowserEvent = this.handleMapBrowserEvent.bind(this); * @type {number}
for (const key in MapBrowserEventType) { */
this.mapBrowserEventHandler_.addEventListener( this.moveTolerance_ = options.moveTolerance;
MapBrowserEventType[key],
handleMapBrowserEvent
);
}
/** /**
* @private * @private
@@ -306,18 +302,6 @@ class PluggableMap extends BaseObject {
*/ */
this.keyHandlerKeys_ = null; this.keyHandlerKeys_ = null;
const handleBrowserEvent = this.handleBrowserEvent.bind(this);
this.viewport_.addEventListener(
EventType.CONTEXTMENU,
handleBrowserEvent,
false
);
this.viewport_.addEventListener(
EventType.WHEEL,
handleBrowserEvent,
PASSIVE_EVENT_LISTENERS ? {passive: false} : false
);
/** /**
* @type {Collection<import("./control/Control.js").default>} * @type {Collection<import("./control/Control.js").default>}
* @protected * @protected
@@ -550,19 +534,6 @@ class PluggableMap extends BaseObject {
* Clean up. * Clean up.
*/ */
disposeInternal() { disposeInternal() {
this.mapBrowserEventHandler_.dispose();
this.viewport_.removeEventListener(
EventType.CONTEXTMENU,
this.boundHandleBrowserEvent_
);
this.viewport_.removeEventListener(
EventType.WHEEL,
this.boundHandleBrowserEvent_
);
if (this.handleResize_ !== undefined) {
removeEventListener(EventType.RESIZE, this.handleResize_, false);
this.handleResize_ = undefined;
}
this.setTarget(null); this.setTarget(null);
super.disposeInternal(); super.disposeInternal();
} }
@@ -1126,9 +1097,10 @@ class PluggableMap extends BaseObject {
} }
/** /**
* @param {import("./Object").ObjectEvent} event Event.
* @private * @private
*/ */
handleTargetChanged_() { handleTargetChanged_(event) {
// target may be undefined, null, a string or an Element. // target may be undefined, null, a string or an Element.
// If it's a string we convert it to an Element before proceeding. // If it's a string we convert it to an Element before proceeding.
// If it's not now an Element we remove the viewport from the DOM. // If it's not now an Element we remove the viewport from the DOM.
@@ -1139,11 +1111,25 @@ class PluggableMap extends BaseObject {
targetElement = this.getTargetElement(); targetElement = this.getTargetElement();
} }
if (this.keyHandlerKeys_) { if (event.oldValue) {
for (let i = 0, ii = this.keyHandlerKeys_.length; i < ii; ++i) { for (let i = 0, ii = this.keyHandlerKeys_.length; i < ii; ++i) {
unlistenByKey(this.keyHandlerKeys_[i]); unlistenByKey(this.keyHandlerKeys_[i]);
} }
this.keyHandlerKeys_ = null; this.keyHandlerKeys_ = null;
this.viewport_.removeEventListener(
EventType.CONTEXTMENU,
this.boundHandleBrowserEvent_
);
this.viewport_.removeEventListener(
EventType.WHEEL,
this.boundHandleBrowserEvent_
);
if (this.handleResize_ !== undefined) {
removeEventListener(EventType.RESIZE, this.handleResize_, false);
this.handleResize_ = undefined;
}
this.mapBrowserEventHandler_.dispose();
removeNode(this.viewport_);
} }
if (!targetElement) { if (!targetElement) {
@@ -1157,17 +1143,33 @@ class PluggableMap extends BaseObject {
cancelAnimationFrame(this.animationDelayKey_); cancelAnimationFrame(this.animationDelayKey_);
this.animationDelayKey_ = undefined; this.animationDelayKey_ = undefined;
} }
removeNode(this.viewport_);
if (this.handleResize_ !== undefined) {
removeEventListener(EventType.RESIZE, this.handleResize_, false);
this.handleResize_ = undefined;
}
} else { } else {
targetElement.appendChild(this.viewport_); targetElement.appendChild(this.viewport_);
if (!this.renderer_) { if (!this.renderer_) {
this.renderer_ = this.createRenderer(); this.renderer_ = this.createRenderer();
} }
this.mapBrowserEventHandler_ = new MapBrowserEventHandler(
this,
this.moveTolerance_
);
for (const key in MapBrowserEventType) {
this.mapBrowserEventHandler_.addEventListener(
MapBrowserEventType[key],
this.handleMapBrowserEvent.bind(this)
);
}
this.viewport_.addEventListener(
EventType.CONTEXTMENU,
this.boundHandleBrowserEvent_,
false
);
this.viewport_.addEventListener(
EventType.WHEEL,
this.boundHandleBrowserEvent_,
PASSIVE_EVENT_LISTENERS ? {passive: false} : false
);
const keyboardEventTarget = !this.keyboardEventTarget_ const keyboardEventTarget = !this.keyboardEventTarget_
? targetElement ? targetElement
: this.keyboardEventTarget_; : this.keyboardEventTarget_;