Signatur
Beschreibung
NavigationActivation gehört zur Navigation API und beschreibt, wie das aktuelle Dokument erreicht wurde (bzw. bei pageswap: wohin das alte Dokument gleich verlassen wird). Anders als NavigateEvent, das nur Navigationen innerhalb desselben Dokuments abdeckt, geht es hier um echte Seitenwechsel, also dokumentübergreifende Navigationen.
Man erhält eine Instanz auf zwei Wegen:
navigation.activationim neuen Dokument, zum Beispiel im Handler vonpagerevealoder beim Laden der Seite.event.activationim Eventpageswapdes alten Dokuments, kurz bevor es entladen wird.
Das Interface hat drei schreibgeschützte Eigenschaften:
entry: einNavigationHistoryEntryfür das Ziel der Navigation.from: einNavigationHistoryEntryfür das vorherige Dokument. Der Wert istnull, wenn das vorherige Dokument einen anderen Ursprung hatte (Cross-Origin) oder das anfänglicheabout:blankwar.navigationType: einer der Werte"push","replace","reload"oder"traverse".
Der wichtigste Einsatzfall sind dokumentübergreifende View Transitions. Je nach Herkunfts- und Ziel-URL oder je nach Richtung (vor oder zurück) kann man unterschiedliche Animationen wählen, etwa über Typen der View Transition oder über view-transition-name für bestimmte Elemente. Außerdem eignet sich das Interface für Analytics, zum Beispiel um Reloads von normalen Seitenaufrufen zu unterscheiden.
Rückgabewert
navigation.activation und PageSwapEvent.activation. Eigenschaften: entry (NavigationHistoryEntry), from (NavigationHistoryEntry | null) und navigationType ("push" | "replace" | "reload" | "traverse").Beispiele
Aktivierung beim Laden der Seite auslesen
if ('navigation' in window && navigation.activation) {
const { entry, from, navigationType } = navigation.activation;
console.log('Typ:', navigationType);
console.log('Ziel:', new URL(entry.url).pathname);
console.log('Herkunft:', from ? new URL(from.url).pathname : '(unbekannt / Cross-Origin)');
}
Richtungsabhängige View Transition im neuen Dokument (pagereveal)
window.addEventListener('pagereveal', (event) => {
if (!event.viewTransition || !navigation.activation) return;
const { from, entry, navigationType } = navigation.activation;
// Zurücknavigation erkennen: Traverse zu einem früheren Eintrag
const isBack = navigationType === 'traverse' && from && entry.index < from.index;
event.viewTransition.types.add(isBack ? 'slide-back' : 'slide-forward');
});
Übergang im alten Dokument vorbereiten (pageswap)
window.addEventListener('pageswap', (event) => {
if (!event.viewTransition || !event.activation) return;
const targetUrl = new URL(event.activation.entry.url);
const match = targetUrl.pathname.match(/^\/produkte\/(\d+)$/);
if (!match) return;
// Nur das angeklickte Vorschaubild bekommt einen gemeinsamen Namen
const img = document.querySelector(`#produkt-${match[1]} img`);
if (img) {
img.style.viewTransitionName = 'produktbild';
// Nach dem Snapshot wieder aufräumen (wichtig bei bfcache)
event.viewTransition.finished.then(() => {
img.style.viewTransitionName = '';
});
}
});
Reloads für Analytics herausfiltern
const type = navigation?.activation?.navigationType ?? 'unbekannt';
if (type !== 'reload') {
navigator.sendBeacon('/analytics', JSON.stringify({
page: location.pathname,
navigationType: type,
}));
}
// Wichtig · Fallstricke
- Browser-Unterstützung:
NavigationActivationgibt es in Chromium-Browsern ab Version 123. Firefox und Safari unterstützen es noch nicht vollständig. Prüfe die Verfügbarkeit daher immer mit'navigation' in windowundnavigation.activationund plane einen Fallback ein. fromkannnullsein: Das ist der Fall bei Cross-Origin-Herkunft (aus Datenschutzgründen) und beim anfänglichenabout:blank. Der Code sollte diesen Fall immer abfangen.navigation.activationkannnullsein, zum Beispiel in Frames ohne passende Navigation oder in manchen Sonderfällen.pageswapundevent.activation: Hier ist der Wertnull, wenn die Navigation Cross-Origin ist oder Weiterleitungen über einen fremden Ursprung laufen.entry.indexist-1, wenn der Eintrag nicht in der aktuellen Verlaufsliste steht. Bei Richtungsvergleichen sollte das berücksichtigt werden.- bfcache: Nach der Wiederherstellung aus dem Back-Forward-Cache wird
navigation.activationaktualisiert. Werte, die beim ersten Laden gespeichert wurden, können danach veraltet sein. - Das Interface ist schreibgeschützt und hat keinen Konstruktor.
new NavigationActivation()wirft einenTypeError.