UNPKG

react-virtualized

Version:

React components for efficiently rendering large, scrollable lists and tabular data

74 lines (61 loc) 2.13 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.registerScrollListener = registerScrollListener; exports.unregisterScrollListener = unregisterScrollListener; var mountedInstances = []; var originalBodyPointerEvents = null; var disablePointerEventsTimeoutId = null; /** * Specifies the number of miliseconds during which to disable pointer events while a scroll is in progress. * This improves performance and makes scrolling smoother. */ var IS_SCROLLING_TIMEOUT = exports.IS_SCROLLING_TIMEOUT = 150; function enablePointerEventsIfDisabled() { if (disablePointerEventsTimeoutId) { disablePointerEventsTimeoutId = null; document.body.style.pointerEvents = originalBodyPointerEvents; originalBodyPointerEvents = null; } } function enablePointerEventsAfterDelayCallback() { enablePointerEventsIfDisabled(); mountedInstances.forEach(function (component) { return component._enablePointerEventsAfterDelayCallback(); }); } function enablePointerEventsAfterDelay() { if (disablePointerEventsTimeoutId) { clearTimeout(disablePointerEventsTimeoutId); } disablePointerEventsTimeoutId = setTimeout(enablePointerEventsAfterDelayCallback, IS_SCROLLING_TIMEOUT); } function onScrollWindow(event) { if (originalBodyPointerEvents == null) { originalBodyPointerEvents = document.body.style.pointerEvents; document.body.style.pointerEvents = 'none'; enablePointerEventsAfterDelay(); } mountedInstances.forEach(function (component) { return component._onScrollWindow(event); }); } function registerScrollListener(component) { if (!mountedInstances.length) { window.addEventListener('scroll', onScrollWindow); } mountedInstances.push(component); } function unregisterScrollListener(component) { mountedInstances = mountedInstances.filter(function (c) { return c !== component; }); if (!mountedInstances.length) { window.removeEventListener('scroll', onScrollWindow); if (disablePointerEventsTimeoutId) { clearTimeout(disablePointerEventsTimeoutId); enablePointerEventsIfDisabled(); } } }