Signatur
Beschreibung
Die Eigenschaft dataset gibt ein DOMStringMap-Objekt zurück. Darin steht jedes benutzerdefinierte Datenattribut (data-*) des Elements als eigene Eigenschaft. Die Eigenschaft dataset selbst ist schreibgeschützt, man kann ihr also kein neues Objekt zuweisen. Die einzelnen Einträge kann man aber lesen, ändern, neu anlegen und mit delete entfernen. Jede Änderung wird sofort als Attribut ins DOM übernommen.
Attributnamen werden automatisch umgewandelt: Aus data-user-id in HTML wird dataset.userId in JavaScript. Das Präfix data- fällt weg, und jeder Bindestrich mit folgendem Kleinbuchstaben wird zu einem Großbuchstaben (camelCase). In der Gegenrichtung wird aus dataset.sortOrder = "asc" das Attribut data-sort-order="asc".
Typische Einsatzfälle sind Konfigurationswerte für Komponenten, IDs für Event-Delegation, Zustände für CSS-Selektoren (z. B. [data-state="open"]) und das Weitergeben von Server-Daten an clientseitige Skripte, ohne versteckte Felder oder globale Variablen zu brauchen.
Alle Werte sind immer Zeichenketten. Zahlen, Wahrheitswerte oder Objekte muss man beim Schreiben selbst umwandeln (z. B. mit JSON.stringify) und beim Lesen wieder zurückwandeln (Number(), JSON.parse()).
Rückgabewert
data-*-Attributen des Elements in camelCase-Schreibweise. Die Werte sind immer vom Typ string. Fragt man ein Attribut ab, das es nicht gibt, erhält man undefined.Beispiele
Datenattribute lesen, setzen und löschen
// <div id="user" data-user-id="42" data-role="admin"></div>
const el = document.getElementById('user');
console.log(el.dataset.userId); // "42"
console.log(el.dataset.role); // "admin"
el.dataset.lastLogin = '2024-05-01'; // erzeugt data-last-login
delete el.dataset.role; // entfernt data-role
console.log(el.outerHTML);
Event-Delegation mit data-Attributen
// <ul id="list">
// <li data-product-id="101" data-price="19.90">Buch</li>
// <li data-product-id="102" data-price="4.50">Stift</li>
// </ul>
const list = document.getElementById('list');
list.addEventListener('click', (event) => {
const item = event.target.closest('[data-product-id]');
if (!item) return;
const { productId, price } = item.dataset;
const priceNum = Number(price); // Werte sind immer Strings!
console.log(`Produkt ${productId} kostet ${priceNum.toFixed(2)} €`);
});
Komplexe Daten als JSON speichern und Zustand für CSS setzen
const panel = document.querySelector('.panel');
// Objekt serialisieren
panel.dataset.config = JSON.stringify({ autoClose: true, delay: 3000 });
const config = JSON.parse(panel.dataset.config);
console.log(config.delay);
// Zustand umschalten, CSS reagiert auf .panel[data-state="open"]
const toggle = () => {
panel.dataset.state = panel.dataset.state === 'open' ? 'closed' : 'open';
};
toggle();
console.log(panel.dataset.state);
// Alle Einträge durchlaufen
for (const [key, value] of Object.entries(panel.dataset)) {
console.log(key, '=>', value);
}
// Wichtig · Fallstricke
- Nur Zeichenketten:
el.dataset.count = 5speichert"5". Mitel.dataset.active = falsewird die Zeichenkette"false"gespeichert, und die ist in einer Bedingung truthy. Werte also immer ausdrücklich umwandeln. - Namensumwandlung: Bindestriche und Großbuchstaben passen nicht immer 1:1 zusammen.
data-fooBarin HTML wird zudata-foobar(HTML-Attribute sind nicht case-sensitiv) und ist daher alsdataset.foobarerreichbar. Wer in JavaScript einen Namen mit Bindestrich setzt, auf den ein Kleinbuchstabe folgt, etwadataset['a-b'], bekommt einenSyntaxError. - Nicht zuweisbar:
el.dataset = {}hat keine Wirkung (im Strict Mode gibt es einenTypeError). Einträge darum einzeln setzen oderObject.assign(el.dataset, {...})verwenden. - Sicherheit: Datenattribute sind im DOM für jeden sichtbar und lassen sich manipulieren. Keine Geheimnisse (Tokens, Passwörter) darin ablegen und Werte vor der Verwendung prüfen. Werte, die in
innerHTMLlanden, müssen maskiert werden, sonst droht XSS. - Performance: Für große Datenmengen oder häufig wechselnde Daten sind
WeakMapoder JavaScript-Eigenschaften besser geeignet, weil jeder Schreibzugriff das DOM verändert und MutationObserver auslöst. - Kompatibilität: Wird von allen modernen Browsern unterstützt, auch von
SVGElementundMathMLElement. Nur sehr alte Browser (IE ≤ 10) brauchen stattdessengetAttribute('data-…').