summaryrefslogtreecommitdiff
path: root/packages/frontend-shared
diff options
context:
space:
mode:
authorおさむのひと <46447427+samunohito@users.noreply.github.com>2024-09-24 10:09:55 +0900
committerGitHub <noreply@github.com>2024-09-24 10:09:55 +0900
commit98de7ca5269a9cd6d42f0382fd923379aec99751 (patch)
treee367dc109b766f8fcd04a05bcae40d10b13e3a4b /packages/frontend-shared
parentci: fix syntax error (#14602) (diff)
downloadsharkey-98de7ca5269a9cd6d42f0382fd923379aec99751.tar.gz
sharkey-98de7ca5269a9cd6d42f0382fd923379aec99751.tar.bz2
sharkey-98de7ca5269a9cd6d42f0382fd923379aec99751.zip
fix(frontend): 連合一覧等のページネーションが壊れていたのを修正 (#14439)
* fix * fix * fix CHANGELOG.md * 開発環境以外でログが出ないように --------- Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
Diffstat (limited to 'packages/frontend-shared')
-rw-r--r--packages/frontend-shared/js/scroll.ts19
1 files changed, 14 insertions, 5 deletions
diff --git a/packages/frontend-shared/js/scroll.ts b/packages/frontend-shared/js/scroll.ts
index 1062e5252f..4f2e9105c3 100644
--- a/packages/frontend-shared/js/scroll.ts
+++ b/packages/frontend-shared/js/scroll.ts
@@ -36,19 +36,27 @@ export function getScrollPosition(el: HTMLElement | null): number {
return container == null ? window.scrollY : container.scrollTop;
}
-export function onScrollTop(el: HTMLElement, cb: () => unknown, tolerance = 1, once = false) {
+export function onScrollTop(el: HTMLElement, cb: (topVisible: boolean) => unknown, tolerance = 1, once = false) {
// とりあえず評価してみる
- if (el.isConnected && isTopVisible(el)) {
- cb();
+ const firstTopVisible = isTopVisible(el);
+ if (el.isConnected && firstTopVisible) {
+ cb(firstTopVisible);
if (once) return null;
}
const container = getScrollContainer(el) ?? window;
+ // 以下のケースにおいて、cbが何度も呼び出されてしまって具合が悪いので1回呼んだら以降は無視するようにする
+ // - スクロールイベントは1回のスクロールで複数回発生することがある
+ // - toleranceの範囲内に収まる程度の微量なスクロールが発生した
+ let prevTopVisible = firstTopVisible;
const onScroll = () => {
if (!document.body.contains(el)) return;
- if (isTopVisible(el, tolerance)) {
- cb();
+
+ const topVisible = isTopVisible(el, tolerance);
+ if (topVisible !== prevTopVisible) {
+ prevTopVisible = topVisible;
+ cb(topVisible);
if (once) removeListener();
}
};
@@ -126,6 +134,7 @@ export function scrollToBottom(
export function isTopVisible(el: HTMLElement, tolerance = 1): boolean {
const scrollTop = getScrollPosition(el);
+ if (_DEV_) console.log(scrollTop, tolerance, scrollTop <= tolerance);
return scrollTop <= tolerance;
}