Signatur
Beschreibung
CookieChangeEvent gehört zur Cookie Store API. Ein solches Objekt bekommst du, wenn du auf window.cookieStore das Event change abonnierst. Es wird ausgelöst, sobald ein Cookie, das für das aktuelle Dokument sichtbar ist, angelegt, überschrieben oder gelöscht wird. Die Quelle spielt dabei keine Rolle: Die Änderung kann aus JavaScript kommen (cookieStore.set(), document.cookie), von einem Set-Cookie-Header des Servers oder aus einem anderen Tab.
Früher musste man document.cookie regelmäßig abfragen, um Änderungen mitzubekommen. Mit dem Event reagierst du dagegen direkt darauf, zum Beispiel wenn eine Sitzung in einem anderen Tab beendet wird, wenn sich ein Einwilligungs-Cookie ändert oder wenn sich die gewählte Sprache ändert.
Das Event bringt zwei schreibgeschützte Eigenschaften mit:
changed: ein fest eingefrorenes Array vonCookieListItem-Objekten (name,value,domain,path,expires,secure,sameSite,partitioned) für neu gesetzte oder überschriebene Cookies.deleted: ein fest eingefrorenes Array vonCookieListItem-Objekten für gelöschte Cookies. Bei gelöschten Cookies ist in der Regel nurnameverlässlich gesetzt,valueist meistundefined.
In Service Workern wird stattdessen das verwandte ExtendableCookieChangeEvent über das Event cookiechange ausgelöst. Dafür musst du die Cookies vorher mit registration.cookies.subscribe() abonnieren.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Konstruktor-Parameter: Name des Events, normalerweise "change". |
|
| $options | object | {} | Konstruktor-Parameter: Optionen, die über EventInit hinausgehen (bubbles, cancelable, composed sind ebenfalls erlaubt). |
| $options.changed | Array<CookieListItem> | [] | Cookies, die als gesetzt bzw. geändert gemeldet werden sollen. |
| $options.deleted | Array<CookieListItem> | [] | Cookies, die als gelöscht gemeldet werden sollen. |
Rückgabewert
changed und deleted. In Event-Handlern bekommst du das Objekt als Argument übergeben.Beispiele
Cookie-Änderungen mit addEventListener überwachen
if ('cookieStore' in window) {
cookieStore.addEventListener('change', (event) => {
for (const cookie of event.changed) {
console.log(`Gesetzt: ${cookie.name} = ${cookie.value}`);
}
for (const cookie of event.deleted) {
console.log(`Gelöscht: ${cookie.name}`);
}
});
// Änderungen auslösen
await cookieStore.set('theme', 'dark');
await cookieStore.delete('theme');
} else {
console.warn('Cookie Store API wird nicht unterstützt');
}
Abmeldung in einem anderen Tab erkennen (onchange-Property)
const handleCookieChange = (event) => {
const sessionDeleted = event.deleted.some((c) => c.name === 'session_id');
if (sessionDeleted) {
console.log('Sitzung beendet – weiter zur Anmeldung');
location.assign('/login');
}
};
cookieStore.onchange = handleCookieChange;
// Später wieder abmelden:
// cookieStore.onchange = null;
Event manuell erzeugen, z. B. für Tests
const event = new CookieChangeEvent('change', {
changed: [{ name: 'lang', value: 'de' }],
deleted: [{ name: 'old_pref' }]
});
console.log(event.type); // "change"
console.log(event.changed[0].name); // "lang"
console.log(event.deleted.length); // 1
console.log(Object.isFrozen(event.changed)); // true
Listener sauber wieder entfernen
const controller = new AbortController();
cookieStore.addEventListener('change', (event) => {
console.log('Änderungen:', event.changed.length, 'gelöscht:', event.deleted.length);
}, { signal: controller.signal });
// Beim Verlassen der Ansicht:
controller.abort();
// Wichtig · Fallstricke
- Browser-Unterstützung: Chromium-Browser unterstützen die API seit Version 87. Safari und Firefox sind erst in neueren Versionen dazugekommen. Prüfe die Unterstützung immer vorher mit
'cookieStore' in windowund sieh eine Ausweichlösung vor, etwa das Abfragen vondocument.cookie. - Nur in sicheren Kontexten: Die API steht nur über HTTPS bzw. auf
localhostzur Verfügung. - HttpOnly-Cookies sind für Skripte unsichtbar. Für sie wird kein
change-Event ausgelöst. - Wenn ein Cookie mit einem Ablaufdatum in der Vergangenheit gesetzt wird, erscheint es in
deletedund nicht inchanged. Wird ein bestehendes Cookie überschrieben, erscheint es nur inchanged. - Bei Einträgen in
deletedistvaluein der Regelundefined. Verlass dich nur aufname(und gegebenenfallspath/domain). - Ein Event kann mehrere Änderungen auf einmal enthalten. Durchlaufe deshalb immer beide Arrays vollständig.
- In Service Workern gibt es kein
change-Event aufcookieStore. Dort verwendest ducookiechangemitExtendableCookieChangeEventund vorherigemsubscribe().