Signatur
Beschreibung
Mit history.go() springt man in der Sitzungshistorie des aktuellen Tabs um eine bestimmte Anzahl von Einträgen vor oder zurück. Ein negativer Wert entspricht mehrfachem Klick auf „Zurück“, ein positiver Wert mehrfachem Klick auf „Vorwärts“. history.go(-1) verhält sich also wie history.back(), history.go(1) wie history.forward().
Wird go() ohne Argument oder mit 0 aufgerufen, lädt der Browser die aktuelle Seite neu – ähnlich wie location.reload(). Liegt der gewünschte Eintrag außerhalb des verfügbaren Bereichs (z. B. go(-10) bei nur drei Einträgen), passiert nichts; es wird kein Fehler geworfen.
Wichtig: Die Navigation erfolgt asynchron. Der Aufruf kehrt sofort zurück, die eigentliche Navigation passiert später. Wer auf den Abschluss reagieren möchte, lauscht bei Einträgen, die per pushState() im selben Dokument angelegt wurden, auf das popstate-Ereignis, bei dokumentübergreifender Navigation auf pageshow/pagehide.
Typische Einsatzgebiete sind Single-Page-Applications mit eigener Routing-Logik, „Zurück“-Schaltflächen in mehrstufigen Formularen (Wizards) oder das gezielte Überspringen mehrerer Zwischenschritte.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $delta | number | 0 | Relative Position in der Historie. Negativ = zurück, positiv = vorwärts, 0 bzw. weggelassen = aktuelle Seite neu laden. Nicht-ganzzahlige Werte werden zu einer Ganzzahl konvertiert. |
Beispiele
Zurück, vorwärts und neu laden
// Eine Seite zurück (wie der Zurück-Button)
history.go(-1);
// Zwei Seiten vorwärts
history.go(2);
// Aktuelle Seite neu laden
history.go(0);
// oder einfach
history.go();
Wizard: mehrere Schritte auf einmal zurückspringen
// Jeder Wizard-Schritt legt einen eigenen History-Eintrag an
const gotoStep = (step) => {
history.pushState({ step }, '', `?step=${step}`);
renderStep(step);
};
const renderStep = (step) => {
document.querySelector('#wizard').textContent = `Schritt ${step}`;
};
// Zurück zum ersten Schritt, egal wo man gerade ist
document.querySelector('#restart').addEventListener('click', () => {
const current = history.state?.step ?? 1;
if (current > 1) history.go(-(current - 1));
});
// Auf die asynchrone Navigation reagieren
window.addEventListener('popstate', (event) => {
renderStep(event.state?.step ?? 1);
});
Auf das Ende der Navigation warten (Promise-Wrapper)
const goAsync = (delta) =>
new Promise((resolve) => {
window.addEventListener('popstate', (e) => resolve(e.state), { once: true });
history.go(delta);
});
const main = async () => {
history.pushState({ page: 'a' }, '', '#a');
history.pushState({ page: 'b' }, '', '#b');
const state = await goAsync(-1);
console.log('Jetzt auf:', state.page);
};
main();
// Wichtig · Fallstricke
- Asynchron: Code direkt nach
history.go()läuft noch auf der alten Position –location.hrefundhistory.statesind dort noch nicht aktualisiert. Aufpopstatewarten. - Außerhalb des Bereichs: Ein zu großer
delta-Wert wird still ignoriert. Die Länge der Historie lieferthistory.length, die aktuelle Position ist jedoch nicht direkt auslesbar. - Promise-Wrapper: Verlässt die Navigation das Dokument (z. B. Eintrag einer anderen Seite), feuert kein
popstateim alten Dokument – ein darauf wartendes Promise löst dann nie auf. - Kein Zugriff auf fremde URLs: Aus Datenschutzgründen kann man die URLs anderer History-Einträge nicht auslesen, nur dorthin navigieren.
- Einschränkungen: In sandboxed iframes oder bei nicht vollständig aktiven Dokumenten kann ein
SecurityErrorgeworfen werden. Manche Browser drosseln sehr häufige History-Aufrufe. - Die Navigation API (
navigation.traverseTo(),navigation.back()) bietet in Chromium-Browsern eine Promise-basierte Alternative, ist aber noch nicht überall verfügbar. - Browser-Kompatibilität:
history.go()wird von allen Browsern seit jeher unterstützt.