From c635c35d21e4458e55c8195cebf6d7c1c2d7c253 Mon Sep 17 00:00:00 2001 From: tdro Date: Fri, 1 Dec 2023 19:28:38 -0500 Subject: static/js/pager: Run on cache persistence Run a limited seek interval --- static/js/pager.ts | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'static') diff --git a/static/js/pager.ts b/static/js/pager.ts index 3f9beaf..6133f21 100644 --- a/static/js/pager.ts +++ b/static/js/pager.ts @@ -7,6 +7,7 @@ return console.log("Pager is disabled due to cookie restrictions."); } + let seek; let settings = { pager: {} }; const key = "settings"; @@ -17,9 +18,9 @@ const scrollRestore = function (url) { if (history.scrollRestoration) history.scrollRestoration = "manual"; settings = JSON.parse(localStorage[key]); - const fragment = self.location.hash.slice(1) && - document.getElementById(self.location.hash.slice(1)); - const fragmentInURL = self.location.hash.length > 0; + const hash = self.location.hash; + const fragment = hash.slice(1) && document.getElementById(hash.slice(1)); + const fragmentInURL = hash.length > 0; if (fragmentInURL && document.body.contains(fragment)) { settings["pager"][url] = self.pageYOffset; localStorage[key] = JSON.stringify(settings); @@ -29,7 +30,13 @@ }); } if (settings["pager"][url] > 0) { - return self.scrollTo(0, settings["pager"][url]); + self.scrollTo(0, settings["pager"][url]); + let i = 0; return seek = setInterval(function (position) { + i++; if (i > 100) clearInterval(seek); + if (document.documentElement.scrollHeight >= position + document.documentElement.clientHeight) { + clearInterval(seek); self.scrollTo(0, position); + } + }, 4, settings["pager"][url]); } settings["pager"][url] = self.pageYOffset; localStorage[key] = JSON.stringify(settings); @@ -55,7 +62,6 @@ }; self.addEventListener("DOMContentLoaded", function () { - scrollRestore(url); self.addEventListener("click", function (event) { const up = document.getElementById("top"); const back = document.getElementById("back"); @@ -63,8 +69,13 @@ }); }); - self.addEventListener("hashchange", function () { - scrollRestore(url); + ["DOMContentLoaded", "pageshow", "hashchange"].forEach(function (event) { + self.addEventListener(event, function (event) { + if (event.type === "pageshow") { + return event.persisted && self.scrollTo(0, settings["pager"][url]); + } + scrollRestore(url); + }); }); ["click", "touchstart", "scroll"].forEach(function (event) { -- cgit v1.2.3