Signatur
Beschreibung
Die schreibgeschützte Eigenschaft to des Interfaces NavigationTransition gibt das NavigationDestination zurück, also das Ziel der gerade laufenden Navigation. Sie ist das Gegenstück zu NavigationTransition.from: from liefert den NavigationHistoryEntry, von dem aus navigiert wird, to das Ziel.
Ein NavigationTransition-Objekt gibt es nur, solange eine abgefangene Navigation läuft. Es entsteht, wenn ein navigate-Handler event.intercept() aufruft, und ist über navigation.transition erreichbar, bis die Navigation abgeschlossen oder abgebrochen ist. In dieser Zeit kann Code außerhalb des navigate-Handlers über navigation.transition.to das Ziel abfragen, etwa url, key, index, sameDocument oder mit getState() den Zustand. So müssen Komponenten das NavigateEvent nicht selbst speichern.
Typische Einsatzfälle:
- Ladeanzeigen, die zeigen, wohin navigiert wird
- Richtungsabhängige Übergangsanimationen, bei denen
from.indexmitto.indexverglichen wird - Vorladen von Daten für die Zielroute aus beliebigen Modulen
Der Wert ist dasselbe Objekt wie NavigateEvent.destination der zugehörigen Navigation.
Rückgabewert
url, key, id, index, sameDocument und der Methode getState(). Bei einer push- oder replace-Navigation ist key ein leerer String, id ebenfalls, und index ist -1.Beispiele
Ziel-URL der laufenden Navigation auslesen
navigation.addEventListener('navigate', (event) => {
if (!event.canIntercept) return;
event.intercept({
handler: async () => {
// Irgendwo im Code, ohne Zugriff auf das Event:
const ziel = navigation.transition?.to;
console.log('Navigiere zu:', ziel?.url);
await renderRoute(new URL(event.destination.url).pathname);
}
});
});
const renderRoute = async (pfad) => {
document.querySelector('main').textContent = `Seite: ${pfad}`;
};
Ladeanzeige mit Zielangabe
const zeigeLadeanzeige = () => {
const transition = navigation.transition;
if (!transition) return;
const zielPfad = new URL(transition.to.url).pathname;
const hinweis = document.querySelector('#lade-hinweis');
hinweis.textContent = `Lade ${zielPfad} …`;
hinweis.hidden = false;
// finished wird erfüllt oder abgelehnt, sobald die Navigation endet
transition.finished
.catch(() => {})
.finally(() => { hinweis.hidden = true; });
};
navigation.addEventListener('navigate', (event) => {
if (!event.canIntercept) return;
event.intercept({ handler: () => new Promise((r) => setTimeout(r, 500)) });
// intercept() wurde aufgerufen, navigation.transition ist nach dem Handler-Start gesetzt
queueMicrotask(zeigeLadeanzeige);
});
Richtung für Übergangsanimationen bestimmen
const ermittleRichtung = () => {
const t = navigation.transition;
if (!t || t.navigationType !== 'traverse') return 'vorwärts';
return t.to.index < t.from.index ? 'zurück' : 'vorwärts';
};
navigation.addEventListener('navigate', (event) => {
if (!event.canIntercept) return;
event.intercept({
handler: async () => {
const richtung = ermittleRichtung();
document.documentElement.dataset.richtung = richtung;
console.log('Animationsrichtung:', richtung);
}
});
});
// Test: im Verlauf zurückgehen
// navigation.back();
Feature-Erkennung mit Rückfall auf event.destination
const hatTransitionTo =
'NavigationTransition' in window &&
'to' in NavigationTransition.prototype;
navigation.addEventListener('navigate', (event) => {
if (!event.canIntercept) return;
event.intercept({
handler: async () => {
const ziel = hatTransitionTo ? navigation.transition.to : event.destination;
console.log(ziel.sameDocument, ziel.url);
}
});
});
// Wichtig · Fallstricke
- Kompatibilität: Die Navigation API selbst gibt es nur in Chromium-Browsern (Chrome/Edge ab 102) und in neueren Versionen von Firefox und Safari.
NavigationTransition.tokam erst später hinzu und ist experimentell. Prüfen Sie die Unterstützung mit'to' in NavigationTransition.prototypeund greifen Sie sonst aufNavigateEvent.destinationzurück. navigation.transitionist oftnull: Das Objekt existiert nur, solange eine Navigation läuft, die mitintercept()abgefangen wurde. Nicht abgefangene, bereits abgeschlossene oder abgebrochene Navigationen haben keintransition. Verwenden Sie deshalb optionale Verkettung (navigation.transition?.to).indexundkey: Nur beitraverse-Navigationen verweist das Ziel auf einen vorhandenen Verlaufseintrag. Beipush/replaceistindexgleich-1, undkey/idsind leer. Richtungsvergleiche sind also nur beitraversesinnvoll.- Kein Verlaufseintrag:
toist einNavigationDestinationund keinNavigationHistoryEntry. Es hat also keindispose-Event und keinesameDocument-Garantie über das Ende der Navigation hinaus. Den endgültigen Eintrag liefert nach Abschlussnavigation.currentEntry. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird still ignoriert, im Strict Mode löst sie einen
TypeErroraus.