From 3ff9cb1408a4e4e102a0890ce351b9803c824d2b Mon Sep 17 00:00:00 2001 From: Thibault Jan Beyer Date: Sun, 14 Jul 2024 18:09:37 +0200 Subject: [PATCH] fix document scroll issue --- DragSelect/src/methods/scrollElement.ts | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/DragSelect/src/methods/scrollElement.ts b/DragSelect/src/methods/scrollElement.ts index 42da340..0ca6921 100644 --- a/DragSelect/src/methods/scrollElement.ts +++ b/DragSelect/src/methods/scrollElement.ts @@ -1,13 +1,28 @@ import { DSArea, DSEdges } from "../types" +let DOC_ELEMENT: HTMLElement; // we store this in the module cache as it is highly unlikely the user to change document + /** Scroll the element in the specified direction */ export const scrollElement = (element?: DSArea, directions?: DSEdges, multiplier: number = 1) => { if (!directions?.length || !element) return - const docEl = - Number.isFinite(document?.documentElement?.scrollTop) && document.documentElement - const _element = - element instanceof Document ? docEl || document.body : element + let _element = element as HTMLElement | SVGElement; // we are typecasting because if it's of type Document we grab the corresponding HTMLElement anyhow + if(element instanceof Document) { + if(DOC_ELEMENT) _element = DOC_ELEMENT; // cached + // either the document is scrollable or the body is scrollable + if(Number.isFinite(document?.documentElement?.scrollTop)) { + const prev = document.documentElement.scrollTop; + document.documentElement.scrollTop += 1 + if (document.documentElement.scrollTop === prev) { + _element = document.body; + DOC_ELEMENT = document.body; + } else { + document.documentElement.scrollTop = prev; + _element = document.documentElement; + DOC_ELEMENT = document.documentElement; + } + } + } const scrollTop = directions.includes('top') && _element.scrollTop > 0 const scrollBot = @@ -15,7 +30,7 @@ export const scrollElement = (element?: DSArea, directions?: DSEdges, multiplier const scrollLeft = directions.includes('left') && _element.scrollLeft > 0 const scrollRight = directions.includes('right') && _element.scrollLeft < _element.scrollWidth - + if (scrollTop) _element.scrollTop -= 1 * multiplier if (scrollBot) _element.scrollTop += 1 * multiplier if (scrollLeft) _element.scrollLeft -= 1 * multiplier