Signatur
Beschreibung
document.location liefert ein Location-Objekt. Es zerlegt die aktuelle URL des Dokuments in ihre Bestandteile, etwa protocol, host, pathname, search und hash. Außerdem stellt es die Methoden assign(), replace() und reload() bereit, mit denen man weiterleiten oder die Seite neu laden kann.
Die Eigenschaft ist im engeren Sinn schreibgeschützt, denn das Location-Objekt selbst lässt sich nicht austauschen. Weist man ihr aber einen String zu, zum Beispiel document.location = "/login", navigiert der Browser zu dieser URL. Das entspricht dem Aufruf document.location.assign("/login").
In einem Dokument, das in einem Browsing-Kontext angezeigt wird, verweist document.location auf dasselbe Objekt wie window.location. Hat das Dokument keinen Browsing-Kontext, gibt die Eigenschaft null zurück. Das ist etwa bei Dokumenten der Fall, die per DOMParser oder document.implementation.createHTMLDocument() erzeugt wurden. Wer nur die URL als String braucht, kann auch document.URL verwenden. Diese Eigenschaft ist wirklich schreibgeschützt und löst keine Navigation aus.
Rückgabewert
Location-Objekt der aktuellen URL des Dokuments. null, wenn das Dokument keinen Browsing-Kontext hat.Beispiele
URL-Bestandteile auslesen
// Angenommen, die Seite läuft unter https://example.com:8080/shop/artikel?id=42#bewertungen
const { protocol, hostname, port, pathname, search, hash } = document.location;
console.log(protocol, hostname, port);
console.log(pathname, search, hash);
console.log(document.location === window.location);
Query-Parameter mit URLSearchParams auswerten
// URL: https://example.com/suche?q=javascript&seite=2
const params = new URLSearchParams(document.location.search);
const suchbegriff = params.get('q') ?? '';
const seite = Number(params.get('seite') ?? 1);
console.log(`Suche nach "${suchbegriff}", Seite ${seite}`);
Weiterleitung nach Login-Prüfung
const pruefeSitzung = async () => {
const res = await fetch('/api/session', { credentials: 'include' });
if (res.status === 401) {
// Rücksprungziel mitgeben; replace() erzeugt keinen History-Eintrag
const ziel = encodeURIComponent(document.location.pathname + document.location.search);
document.location.replace(`/login?redirect=${ziel}`);
}
};
pruefeSitzung();
Zuweisung navigiert, Hash-Änderung nicht
// Ändert nur den Anker: kein Neuladen, es feuert aber ein hashchange-Event
document.location.hash = 'kontakt';
// Zuweisung eines Strings löst eine Navigation aus (wie assign())
const zurStartseite = () => {
document.location = '/';
};
// Dokumente ohne Browsing-Kontext haben kein Location-Objekt
const doc = new DOMParser().parseFromString('<p>Hallo</p>', 'text/html');
console.log(doc.location);
// Wichtig · Fallstricke
- Sicherheit (Open Redirect/XSS): Weise
document.locationoderlocation.hrefniemals ungeprüfte Nutzereingaben zu, etwa einen?redirect=-Parameter. Eine URL wiejavascript:alert(1)führt Code aus. Fremde Ziele missbrauchen Angreifer für Phishing. Prüfe das Ziel deshalb mitnew URL(ziel, location.origin)und vergleiche danachoriginbzw. das Protokoll. - Auch das Auslesen von
location.hashoderlocation.searchund das Einfügen perinnerHTMList eine klassische DOM-XSS-Quelle. Verwende stattdessentextContent. assign()und die direkte Zuweisung legen einen neuen Eintrag im Verlauf an.replace()tut das nicht, dann funktioniert der Zurück-Button nicht zur alten Seite.- Wird nur
hashgeändert, lädt die Seite nicht neu. Änderungen anpathname,searchoderhostlösen dagegen eine Navigation aus. Für URL-Änderungen ohne Neuladen gibt eshistory.pushState(). - Zugriff über Fenstergrenzen hinweg, etwa
iframe.contentDocument.location, ist durch die Same-Origin-Policy beschränkt. Von fremden Ursprüngen aus ist nur das Setzen der URL erlaubt. - Für neuen Code ist
window.locationgebräuchlicher und klarer. In allen Browsern verhalten sich beide gleich.