|
6 | 6 | export let elementScroll = null;
|
7 | 7 | export let hasMore = true;
|
8 | 8 | export let reverse = false;
|
| 9 | + export let window = false; |
9 | 10 |
|
10 | 11 | const dispatch = createEventDispatcher();
|
11 | 12 | let isLoadMore = false;
|
12 | 13 | let component;
|
13 | 14 | let beforeScrollHeight;
|
14 | 15 | let beforeScrollTop;
|
15 | 16 |
|
16 |
| - $: if (component || elementScroll) { |
17 |
| - const element = elementScroll ? elementScroll : component.parentNode; |
| 17 | + $: if (component || elementScroll || window) { |
| 18 | + const element = getElement(); |
18 | 19 |
|
19 | 20 | if (reverse) {
|
20 | 21 | element.scrollTop = element.scrollHeight;
|
|
25 | 26 | }
|
26 | 27 |
|
27 | 28 | $: if (isLoadMore && reverse) {
|
28 |
| - const element = elementScroll ? elementScroll : component.parentNode; |
| 29 | + const element = getElement(); |
29 | 30 |
|
30 | 31 | element.scrollTop =
|
31 | 32 | element.scrollHeight - beforeScrollHeight + beforeScrollTop;
|
|
34 | 35 | const onScroll = e => {
|
35 | 36 | if (!hasMore) return;
|
36 | 37 |
|
37 |
| - let offset = 0; |
38 |
| -
|
39 |
| - if (reverse) { |
40 |
| - offset = horizontal ? e.target.scrollLeft : e.target.scrollTop; |
41 |
| - } else { |
42 |
| - offset = horizontal |
43 |
| - ? e.target.scrollWidth - e.target.clientWidth - e.target.scrollLeft |
44 |
| - : e.target.scrollHeight - e.target.clientHeight - e.target.scrollTop; |
45 |
| - } |
| 38 | + const offset = calcOffset(e, reverse, horizontal); |
46 | 39 |
|
47 | 40 | if (offset <= threshold) {
|
48 | 41 | if (!isLoadMore && hasMore) {
|
|
57 | 50 | }
|
58 | 51 | };
|
59 | 52 |
|
| 53 | + const calcOffset = (e, reverse, horizontal) => { |
| 54 | + const element = e.target.documentElement |
| 55 | + ? e.target.documentElement |
| 56 | + : e.target; |
| 57 | +
|
| 58 | + if (reverse) { |
| 59 | + return horizontal ? element.scrollLeft : element.scrollTop; |
| 60 | + } else { |
| 61 | + return horizontal |
| 62 | + ? element.scrollWidth - element.clientWidth - element.scrollLeft |
| 63 | + : element.scrollHeight - element.clientHeight - element.scrollTop; |
| 64 | + } |
| 65 | + }; |
| 66 | +
|
| 67 | + const getElement = () => { |
| 68 | + if (window) { |
| 69 | + return document; |
| 70 | + } else if (elementScroll) { |
| 71 | + return elementScroll; |
| 72 | + } |
| 73 | +
|
| 74 | + return component.parentNode; |
| 75 | + }; |
| 76 | +
|
60 | 77 | onDestroy(() => {
|
61 | 78 | if (component || elementScroll) {
|
62 |
| - const element = elementScroll ? elementScroll : component.parentNode; |
| 79 | + const element = getElement(); |
63 | 80 |
|
64 | 81 | element.removeEventListener("scroll", null);
|
65 | 82 | element.removeEventListener("resize", null);
|
|
0 commit comments