forked from bvaughn/react-virtualized
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathonScroll.js
94 lines (81 loc) · 2.38 KB
/
onScroll.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// @flow
'no babel-plugin-flow-react-proptypes';
import {
requestAnimationTimeout,
cancelAnimationTimeout,
} from '../../utils/requestAnimationTimeout';
import type WindowScroller from '../WindowScroller.js';
let mountedInstances = [];
let originalBodyPointerEvents = null;
let disablePointerEventsTimeoutId = null;
function enablePointerEventsIfDisabled() {
if (disablePointerEventsTimeoutId) {
disablePointerEventsTimeoutId = null;
if (document.body && originalBodyPointerEvents != null) {
document.body.style.pointerEvents = originalBodyPointerEvents;
}
originalBodyPointerEvents = null;
}
}
function enablePointerEventsAfterDelayCallback() {
enablePointerEventsIfDisabled();
mountedInstances.forEach(instance => instance.__resetIsScrolling());
}
function enablePointerEventsAfterDelay() {
if (disablePointerEventsTimeoutId) {
cancelAnimationTimeout(disablePointerEventsTimeoutId);
}
var maximumTimeout = 0;
mountedInstances.forEach(instance => {
maximumTimeout = Math.max(
maximumTimeout,
instance.props.scrollingResetTimeInterval,
);
});
disablePointerEventsTimeoutId = requestAnimationTimeout(
enablePointerEventsAfterDelayCallback,
maximumTimeout,
);
}
function onScrollWindow(event: Event) {
if (
event.currentTarget === window &&
originalBodyPointerEvents == null &&
document.body
) {
originalBodyPointerEvents = document.body.style.pointerEvents;
document.body.style.pointerEvents = 'none';
}
enablePointerEventsAfterDelay();
mountedInstances.forEach(instance => {
if (instance.props.scrollElement === event.currentTarget) {
instance.__handleWindowScrollEvent();
}
});
}
export function registerScrollListener(
component: WindowScroller,
element: Element,
) {
if (
!mountedInstances.some(instance => instance.props.scrollElement === element)
) {
element.addEventListener('scroll', onScrollWindow);
}
mountedInstances.push(component);
}
export function unregisterScrollListener(
component: WindowScroller,
element: Element,
) {
mountedInstances = mountedInstances.filter(
instance => instance !== component,
);
if (!mountedInstances.length) {
element.removeEventListener('scroll', onScrollWindow);
if (disablePointerEventsTimeoutId) {
cancelAnimationTimeout(disablePointerEventsTimeoutId);
enablePointerEventsIfDisabled();
}
}
}