Signatur
Beschreibung
Die schreibgeschützte Eigenschaft Element.attributes gibt eine NamedNodeMap zurück, die alle Attribute des Elements als Attr-Objekte enthält. Jedes Attr hat unter anderem die Eigenschaften name, value, localName, namespaceURI und ownerElement.
Die Sammlung ist live: Wird ein Attribut per setAttribute() oder removeAttribute() geändert, spiegelt sich das sofort in der bereits abgerufenen NamedNodeMap wider. Die Eigenschaft selbst ist zwar schreibgeschützt, die enthaltenen Attribute lassen sich aber über attr.value oder Methoden wie removeNamedItem() verändern.
Typische Einsatzzwecke sind das Auflisten oder Kopieren aller Attribute (z. B. beim Klonen oder Umbauen von Elementen), Debugging, Sanitizer-Logik oder das generische Auslesen unbekannter data-*- und aria-*-Attribute. Wenn Sie nur die Namen benötigen, ist Element.getAttributeNames() meist einfacher; für einzelne Werte genügen getAttribute() bzw. hasAttribute().
Die Reihenfolge der Einträge ist nicht verbindlich spezifiziert – in der Praxis entspricht sie meist der Reihenfolge im Quelltext bzw. des Hinzufügens, darauf sollten Sie sich aber nicht verlassen.
Rückgabewert
Attr-Objekten. Zugriff per Index (attributes[0]), per Name (attributes.getNamedItem('id') bzw. attributes['id']) und über length. Die Sammlung ist iterierbar (for...of).Beispiele
Alle Attribute eines Elements auflisten
const link = document.createElement('a');
link.setAttribute('href', '/kontakt');
link.setAttribute('class', 'btn');
link.setAttribute('data-track', 'nav');
for (const attr of link.attributes) {
console.log(`${attr.name} = "${attr.value}"`);
}
console.log('Anzahl:', link.attributes.length);
Attribute als einfaches Objekt auslesen
const input = document.createElement('input');
input.setAttribute('type', 'email');
input.setAttribute('name', 'mail');
input.setAttribute('required', '');
const attrsToObject = (el) =>
Object.fromEntries(Array.from(el.attributes, ({ name, value }) => [name, value]));
console.log(attrsToObject(input));
Attribute auf ein neues Element übertragen (Tag umbenennen)
const div = document.createElement('div');
div.id = 'hinweis';
div.className = 'box warn';
div.setAttribute('role', 'note');
div.textContent = 'Achtung!';
const section = document.createElement('section');
for (const { name, value } of div.attributes) {
section.setAttribute(name, value);
}
section.append(...div.childNodes);
console.log(section.outerHTML);
Live-Verhalten und sicheres Entfernen aller data-Attribute
const el = document.createElement('span');
el.setAttribute('data-a', '1');
el.setAttribute('data-b', '2');
el.setAttribute('title', 'Info');
const attrs = el.attributes;
console.log(attrs.length); // 3
// Erst in ein Array kopieren, da die Sammlung live ist
[...attrs]
.filter((a) => a.name.startsWith('data-'))
.forEach((a) => el.removeAttribute(a.name));
console.log(attrs.length, el.outerHTML);
// Wichtig · Fallstricke
- Live-Sammlung: Wer beim Durchlaufen per Index Attribute entfernt, überspringt Einträge, weil sich Indizes verschieben. Vorher mit
[...el.attributes]oderArray.from()kopieren oder rückwärts iterieren. NamedNodeMapist kein Array:map(),filter()usw. fehlen.for...ofundArray.from()funktionieren in allen modernen Browsern.- Der Zugriff per Name (
attributes.idoderattributes['data-x']) funktioniert, kann aber mit Eigenschaften derNamedNodeMap(z. B.length,item) kollidieren – sicherer istgetNamedItem(). - Die Reihenfolge der Attribute ist nicht garantiert.
- Attribute sind nicht dasselbe wie DOM-Eigenschaften:
input.valuenach einer Benutzereingabe unterscheidet sich vom Attributvalueinattributes. - Sicherheit: Beim Kopieren von Attributen aus fremdem Markup werden auch Event-Handler-Attribute wie
onclickoderhref="javascript:…"übertragen – bei nicht vertrauenswürdigen Inhalten filtern (XSS-Gefahr). - Kompatibilität: in allen Browsern verfügbar;
Attrerbt seit DOM4 nicht mehr sinnvoll vonNode-Kindknoten-Logik – ältere Muster wieattr.nodeValuebesser durchattr.valueersetzen.