diff options
Diffstat (limited to 'static/js/pager.ts')
-rw-r--r-- | static/js/pager.ts | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/static/js/pager.ts b/static/js/pager.ts index 99f88c7..0c512ce 100644 --- a/static/js/pager.ts +++ b/static/js/pager.ts @@ -7,49 +7,54 @@ return console.warn("WARNING: Pager disabled due to cookie restrictions"); } + let url; let seek; - let settings = { pager: {} }; + let pager = {}; - const key = "settings"; - const url = self.location.href.split("#")[0].split("?")[0]; + const key = "config.scroll.pager.urls"; - if (!localStorage[key]) localStorage[key] = JSON.stringify(settings); + if (!localStorage[key]) localStorage[key] = JSON.stringify(pager); + + const link = function () { + url = self.location.href.split("#")[0].split("?")[0]; + }; const scrollRestore = function (url) { if (history.scrollRestoration) history.scrollRestoration = "manual"; - settings = JSON.parse(localStorage[key]); + pager = JSON.parse(localStorage[key]); 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); + pager[url] = self.pageYOffset; + localStorage[key] = JSON.stringify(pager); fragment.scrollIntoView(); return self.addEventListener("DOMContentLoaded", function () { fragment.scrollIntoView(); }); } - if (settings["pager"][url] > 0) { - self.scrollTo(0, settings["pager"][url]); + if (pager[url] > 0) { + clearInterval(seek) + self.scrollTo(0, 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); + }, 4, pager[url]); + } else self.scrollTo(0, 0); + pager[url] = self.pageYOffset; + localStorage[key] = JSON.stringify(pager); }; const scrollTrack = function (url) { const currentPosition = self.pageYOffset; - settings = JSON.parse(localStorage[key]); - settings["pager"][url] = currentPosition; - localStorage[key] = JSON.stringify(settings); + pager = JSON.parse(localStorage[key]); + pager[url] = currentPosition; + localStorage[key] = JSON.stringify(pager); }; - const reverseTrack = function (back, up, event) { + const scrollReverse = function (back, up, event) { if (document.body.contains(up) && up.contains(event.target)) { event.preventDefault(); window.scrollTo(0, 0); @@ -65,22 +70,22 @@ self.addEventListener("click", function (event) { const up = document.getElementById("top"); const back = document.getElementById("back"); - reverseTrack(back, up, event); + scrollReverse(back, up, event); }); }); - ["DOMContentLoaded", "pageshow", "hashchange"].forEach(function (event) { + ["DOMContentLoaded", "pageshow", "hashchange", "URLChangedCustomEvent"].forEach(function (event) { self.addEventListener(event, function (event) { if (event.type === "pageshow") { - return event.persisted && self.scrollTo(0, settings["pager"][url]); + return event.persisted && self.scrollTo(0, pager[url]); } - scrollRestore(url); + link(); scrollRestore(url); }); }); ["click", "touchstart", "scroll"].forEach(function (event) { self.addEventListener(event, function () { - scrollTrack(url); + link(); scrollTrack(url); }); }); })(); |