diff --git a/src/client/app/router.ts b/src/client/app/router.ts index 3f90c213..cb4058f6 100644 --- a/src/client/app/router.ts +++ b/src/client/app/router.ts @@ -66,7 +66,17 @@ export function createRouter( async function go(href: string = inBrowser ? location.href : '/') { href = normalizeHref(href) if ((await router.onBeforeRouteChange?.(href)) === false) return - updateHistory(href) + if (inBrowser) { + const currentUrl = new URL(location.href) + if (href !== normalizeHref(currentUrl.href)) { + // save scroll position before changing url + history.replaceState({ scrollPosition: window.scrollY }, document.title) + history.pushState(null, '', href) + if (new URL(href, fakeHost).hash !== currentUrl.hash) { + window.dispatchEvent(new Event('hashchange')) + } + } + } await loadPage(href) await router.onAfterRouteChanged?.(href) } @@ -180,7 +190,7 @@ export function createRouter( : link.href, link.baseURI ) - const currentUrl = new URL(window.location.href) // copy to keep old data + const currentUrl = new URL(location.href) // copy to keep old data // only intercept inbound html links if ( !e.ctrlKey && @@ -199,7 +209,7 @@ export function createRouter( // scroll between hash anchors in the same page // avoid duplicate history entries when the hash is same if (hash !== currentUrl.hash) { - history.pushState(null, '', hash) + history.pushState(null, '', href) // still emit the event so we can listen to it in themes window.dispatchEvent(new Event('hashchange')) } @@ -207,7 +217,6 @@ export function createRouter( // use smooth scroll when clicking on header anchor links scrollTo(link, hash, link.classList.contains('header-anchor')) } else { - updateHistory(href, false) // already emitted hashchange above window.scrollTo(0, 0) } } else { @@ -300,18 +309,6 @@ function shouldHotReload(payload: PageDataPayload): boolean { return payloadPath === locationPath } -function updateHistory(href: string, emitHashChange = true) { - if (inBrowser && normalizeHref(href) !== normalizeHref(location.href)) { - const currentHash = location.hash - // save scroll position before changing url - history.replaceState({ scrollPosition: window.scrollY }, document.title) - history.pushState(null, '', href) - if (emitHashChange && new URL(href, fakeHost).hash !== currentHash) { - window.dispatchEvent(new Event('hashchange')) - } - } -} - function normalizeHref(href: string): string { const url = new URL(href, fakeHost) url.pathname = url.pathname.replace(/(^|\/)index(\.html)?$/, '$1')