diff --git a/src/application.js b/src/application.js index 4562f2fd..af2dd890 100644 --- a/src/application.js +++ b/src/application.js @@ -43,18 +43,23 @@ const Application = (config) => { let lastInputTime = 0 let lastInputKey = null let mouseListenersAdded = false + const eventTarget = Settings.get('eventTarget', document) + const _window = (typeof window === 'object') ? window : undefined + config.hooks[symbols.destroy] = function () { // Cancel pending key-hold timeout and reset hold state so focus is not left in hold mode after teardown clearTimeout(holdTimeout) Focus.hold = false - document.removeEventListener('keydown', keyDownHandler) - document.removeEventListener('keyup', keyUpHandler) + eventTarget.removeEventListener('keydown', keyDownHandler) + eventTarget.removeEventListener('keyup', keyUpHandler) if (mouseListenersAdded) { - document.removeEventListener('mousemove', mouseMoveHandler) - document.removeEventListener('click', mouseClickHandler) - window.removeEventListener('resize', updateCanvasRect) - window.removeEventListener('scroll', updateCanvasRect) + eventTarget.removeEventListener('mousemove', mouseMoveHandler) + eventTarget.removeEventListener('click', mouseClickHandler) + if (_window) { + _window.removeEventListener('resize', updateCanvasRect) + _window.removeEventListener('scroll', updateCanvasRect) + } Hover.clear() } } @@ -195,15 +200,17 @@ const Application = (config) => { currentComponent.$input(e) } - document.addEventListener('keydown', keyDownHandler) - document.addEventListener('keyup', keyUpHandler) + eventTarget.addEventListener('keydown', keyDownHandler) + eventTarget.addEventListener('keyup', keyUpHandler) if (mouseEnabled === true) { updateCanvasRect() - document.addEventListener('mousemove', mouseMoveHandler) - document.addEventListener('click', mouseClickHandler) - window.addEventListener('resize', updateCanvasRect) - window.addEventListener('scroll', updateCanvasRect) - mouseListenersAdded = true + eventTarget.addEventListener('mousemove', mouseMoveHandler) + eventTarget.addEventListener('click', mouseClickHandler) + if (_window) { + _window.addEventListener('resize', updateCanvasRect) + _window.addEventListener('scroll', updateCanvasRect) + mouseListenersAdded = true + } } // next tick diff --git a/src/focus/focus.js b/src/focus/focus.js index 2378450d..35defc3d 100644 --- a/src/focus/focus.js +++ b/src/focus/focus.js @@ -27,6 +27,8 @@ let focusedComponent = null let focusChain = [] let setFocusTimeout +const _eventTarget = Settings.get('eventTarget', document) + export const keyUpCallbacks = new Map() export default { @@ -135,6 +137,6 @@ const setFocus = (component, event) => { if (event instanceof KeyboardEvent) { const internalEvent = new InternalKeyboardEvent('keydown', event) - document.dispatchEvent(internalEvent) + _eventTarget.dispatchEvent(internalEvent) } } diff --git a/src/launch.js b/src/launch.js index 0449c977..8c39986c 100644 --- a/src/launch.js +++ b/src/launch.js @@ -90,6 +90,7 @@ async function rendererVersion() { * @property {boolean} [announcer] - Whether or not the announcer should be activated on initialization * @property {boolean} [enableMouse] - Enable mouse support (hover and click-to-focus). Defaults to false. * @property {number} [maxFPS] - Maximum FPS + * @property {EventTarget} [eventTarget] - Event target to listen on and dipatch events to */ /**