Signatur
Beschreibung
Die Methode updateCurrentEntry() des Navigation-Interfaces ersetzt den gespeicherten Zustand (state) des aktuellen Verlaufseintrags, also von navigation.currentEntry. Die URL bleibt gleich, es gibt kein navigate-Event und der Verlauf bekommt keinen neuen Eintrag.
Sinnvoll ist das bei Zuständen, die zur aktuellen Seite gehören, aber in der URL nichts zu suchen haben. Beispiele sind aufgeklappte Bereiche, die Scrollposition in einer Liste, der Zwischenstand eines Formulars oder die gewählte Tab-Ansicht. Kehrt der Nutzer später per Zurück/Vorwärts zu diesem Eintrag zurück, liest man den Zustand mit navigation.currentEntry.getState() wieder aus.
Innerhalb der Navigation API entspricht das in etwa history.replaceState(state, "") ohne URL-Änderung. Der Zustand wird mit dem structured clone-Algorithmus kopiert. Erlaubt sind also Objekte, Arrays, Map, Set, Date usw., aber keine Funktionen und keine DOM-Knoten. Nach dem Aufruf feuert navigation das Event currententrychange. Dessen navigationType ist dabei null.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $options Pflicht | Object | Options-Objekt. Es muss übergeben werden. | |
| $options.state Pflicht | any | Der neue Zustand für den aktuellen Eintrag. Er muss per structured clone kopierbar sein und ersetzt den bisherigen Zustand vollständig. Es wird nichts zusammengeführt. |
Rückgabewert
navigation.currentEntry.getState() aus.Beispiele
Filterzustand im aktuellen Eintrag speichern
// Filter einer Produktliste merken, ohne die URL zu ändern
const saveFilter = (filter) => {
navigation.updateCurrentEntry({
state: { ...navigation.currentEntry.getState(), filter }
});
};
saveFilter({ category: 'buecher', sort: 'preis' });
console.log(navigation.currentEntry.getState());
Zustand beim Zurücknavigieren wiederherstellen
const restoreUi = () => {
const state = navigation.currentEntry.getState() ?? {};
document.querySelector('#details').open = Boolean(state.detailsOpen);
};
// Beim Auf- und Zuklappen den Zustand im Eintrag speichern
document.querySelector('#details').addEventListener('toggle', (event) => {
navigation.updateCurrentEntry({
state: { ...navigation.currentEntry.getState(), detailsOpen: event.target.open }
});
});
// Nach jedem Wechsel des aktuellen Eintrags (z. B. Zurück-Taste) die Oberfläche anpassen
navigation.addEventListener('currententrychange', restoreUi);
restoreUi();
Funktionsprüfung und Fehlerbehandlung
const safeUpdateState = (state) => {
if (!('navigation' in window)) {
// Rückfall auf die History API
history.replaceState(state, '');
return;
}
try {
navigation.updateCurrentEntry({ state });
} catch (err) {
// DataCloneError: Zustand ist nicht kopierbar
// InvalidStateError: Dokument nicht aktiv oder wird gerade entladen
console.error(err.name, err.message);
}
};
safeUpdateState({ scrollY: window.scrollY });
safeUpdateState({ callback: () => {} });
// Wichtig · Fallstricke
- Vollständiges Ersetzen:
stateüberschreibt den bisherigen Zustand komplett. Um Teile zu erhalten, den alten Zustand zuerst pergetState()lesen und dann mit dem Spread-Operator zusammenführen. - Ausnahmen: Ein
DataCloneErrortritt auf, wenn der Zustand nicht kopierbar ist, etwa bei Funktionen, DOM-Knoten oder Symbolen. EinInvalidStateErrortritt auf, wenn das Dokument nicht vollständig aktiv ist, gerade entladen wird oder es keinencurrentEntrygibt, zum Beispiel aufabout:blankdirekt nach dem Öffnen. - Kein
navigate-Event: Es wird nurcurrententrychangeausgelöst. Wer gleichzeitig die URL ändern will, nimmtnavigation.navigate(url, { state, history: 'replace' }). - Nur innerhalb der Sitzung: Der Zustand bleibt für diesen Verlaufseintrag erhalten, auch nach einem Neuladen. Er gilt aber nicht für neue Tabs und gehört nicht in die URL. Teilbare Zustände sollten deshalb in die URL, nicht in
state. - Größe: Browser können sehr große Zustandsobjekte begrenzen. Speichere daher nur kleine, serialisierbare Daten.
- Kompatibilität: Die Navigation API gibt es in Chromium-Browsern seit Version 102. In Firefox und Safari ist sie erst in aktuellen Versionen dazugekommen. Deshalb vorher mit
'navigation' in windowprüfen und als Rückfallhistory.replaceState()nutzen.