🐛 Fixed jerky scrolling in Site Design for Safari (#19974)
no issue - Keeping state of the scroll location to keep in sync with iframe buffering caused performance issues in Safari. - This adds a debounce to when the scroll location is updated which fixes jerky scrolling in Safari.
This commit is contained in:
parent
2332f339dc
commit
a732164d54
@ -11,6 +11,19 @@ type IframeBufferingProps = {
|
|||||||
addDelay?: boolean;
|
addDelay?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function debounce(func: any, wait: number) { // eslint-disable-line
|
||||||
|
let timeout: NodeJS.Timeout;
|
||||||
|
|
||||||
|
return function executedFunction(...args: any) { // eslint-disable-line
|
||||||
|
const later = () => {
|
||||||
|
clearTimeout(timeout);
|
||||||
|
func(...args);
|
||||||
|
};
|
||||||
|
clearTimeout(timeout);
|
||||||
|
timeout = setTimeout(later, wait);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const IframeBuffering: React.FC<IframeBufferingProps> = ({generateContent, className, height, width, parentClassName, testId, addDelay = false}) => {
|
const IframeBuffering: React.FC<IframeBufferingProps> = ({generateContent, className, height, width, parentClassName, testId, addDelay = false}) => {
|
||||||
const [visibleIframeIndex, setVisibleIframeIndex] = useState(0);
|
const [visibleIframeIndex, setVisibleIframeIndex] = useState(0);
|
||||||
const iframes = [useRef<HTMLIFrameElement>(null), useRef<HTMLIFrameElement>(null)]; // eslint-disable-line
|
const iframes = [useRef<HTMLIFrameElement>(null), useRef<HTMLIFrameElement>(null)]; // eslint-disable-line
|
||||||
@ -48,9 +61,10 @@ const IframeBuffering: React.FC<IframeBufferingProps> = ({generateContent, class
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const iframe = iframes[visibleIframeIndex].current;
|
const iframe = iframes[visibleIframeIndex].current;
|
||||||
const onScroll = () => {
|
|
||||||
|
const onScroll = debounce(() => {
|
||||||
setScrollPosition(iframe?.contentWindow?.scrollY || 0);
|
setScrollPosition(iframe?.contentWindow?.scrollY || 0);
|
||||||
};
|
}, 250);
|
||||||
|
|
||||||
iframe?.contentWindow?.addEventListener('scroll', onScroll);
|
iframe?.contentWindow?.addEventListener('scroll', onScroll);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user