Signatur
Beschreibung
Die Eigenschaft navigationType des NavigateEvent-Interfaces gibt an, welche Art von Navigation das navigate-Ereignis auf window.navigation ausgelöst hat. Sie ist schreibgeschützt und enthält immer einen von vier Werten:
"push": Ein neuer Eintrag wird im Verlauf angelegt, z. B. durch einen Linkklick,navigation.navigate(url)oderhistory.pushState()."replace": Der aktuelle Eintrag wird ersetzt, z. B. durchnavigation.navigate(url, { history: "replace" }),location.replace()oderhistory.replaceState()."reload": Die aktuelle Seite wird neu geladen (navigation.reload(),location.reload(), Neu-laden-Schaltfläche des Browsers)."traverse": Der Nutzer bewegt sich im Verlauf, z. B. über Zurück/Vor,history.back()odernavigation.traverseTo().
Besonders nützlich ist die Eigenschaft in Single-Page-Anwendungen, die Navigationen über event.intercept() selbst verarbeiten. Anhand des Typs kann man unterschiedlich reagieren: Bei "push" nach oben scrollen, bei "traverse" die Scrollposition wiederherstellen, bei "reload" Daten neu vom Server holen statt aus dem Zwischenspeicher, oder Übergangsanimationen je nach Richtung wählen.
Die Eigenschaft gibt nur über die Art der Navigation Auskunft, nicht über ihre Richtung. Bei "traverse" muss man dafür event.destination.index mit navigation.currentEntry.index vergleichen.
Rückgabewert
NavigationType).Beispiele
Navigationstyp protokollieren
navigation.addEventListener("navigate", (event) => {
console.log(`Navigation (${event.navigationType}) nach ${event.destination.url}`);
});
// Auslösen per Code:
navigation.navigate("/produkte");
navigation.navigate("/produkte?seite=2", { history: "replace" });
SPA-Router: je nach Typ unterschiedlich reagieren
const renderRoute = async (url, { frisch = false } = {}) => {
const res = await fetch(url.pathname + "?partial=1", {
cache: frisch ? "reload" : "default",
});
document.querySelector("main").innerHTML = await res.text();
};
navigation.addEventListener("navigate", (event) => {
// Nur gleiche Herkunft und abfangbare Navigationen behandeln
if (!event.canIntercept || event.hashChange || event.downloadRequest) return;
const url = new URL(event.destination.url);
event.intercept({
// Bei traverse stellt der Browser die Scrollposition selbst wieder her
scroll: "after-transition",
handler: async () => {
await renderRoute(url, { frisch: event.navigationType === "reload" });
if (event.navigationType === "push" || event.navigationType === "replace") {
document.querySelector("h1")?.focus();
}
},
});
});
Richtung bei Verlaufsnavigation bestimmen
navigation.addEventListener("navigate", (event) => {
if (event.navigationType !== "traverse") return;
const ziel = event.destination.index;
const aktuell = navigation.currentEntry.index;
const richtung = ziel < aktuell ? "zurück" : "vor";
document.documentElement.dataset.transition = richtung;
console.log(`Verlauf: ${richtung} (${aktuell} → ${ziel})`);
});
history.back();
// Wichtig · Fallstricke
- Browser-Kompatibilität: Die Navigation API gibt es in Chromium-Browsern seit Version 102, in Firefox und Safari erst seit Kurzem (Firefox 147, Safari 26.2). Prüfe die Unterstützung vor der Verwendung mit
if ("navigation" in window)und sieh eine Ausweichlösung überpopstate/History API vor. "reload"- und"traverse"-Navigationen zu anderen Dokumenten lassen sich nicht immer abfangen. Prüfe deshalb vorintercept()stetsevent.canIntercept. Traverse-Navigationen sind außerdem oft nicht abbrechbar (event.cancelable === false), dann bewirktpreventDefault()nichts.- Auch
history.pushState()undhistory.replaceState()lösen einnavigate-Ereignis mit dem Typ"push"bzw."replace"aus. Das kann in gemischten Codebasen zu doppelter Verarbeitung führen. - Ein Wechsel nur des Fragments (
#anker) ist in der Regel vom Typ"push". Unterscheide ihn überevent.hashChange. - Den Typ der ersten Seitenladung liefert diese Eigenschaft nicht, denn dafür wird kein
navigate-Ereignis ausgelöst. Dafür istperformance.getEntriesByType("navigation")[0].typezuständig.