Signatur
Beschreibung
nodeName ist auf jedem DOM-Knoten verfügbar und liefert je nach Knotentyp einen anderen Namen. Die Eigenschaft ist schreibgeschützt. Zuweisungen werden stillschweigend ignoriert, im Strict Mode lösen sie einen TypeError aus.
Der Rückgabewert hängt vom Knotentyp ab:
- Element: der qualifizierte Name, also derselbe Wert wie
Element.tagName. In HTML-Dokumenten ist er großgeschrieben ("DIV"), in XML- und SVG-Kontexten bleibt die Originalschreibweise erhalten ("svg","circle"). - Attr: der qualifizierte Attributname (
"class"). - Text:
"#text". CDATASection:"#cdata-section". Comment:"#comment". - Document:
"#document". DocumentFragment:"#document-fragment". - DocumentType: der Doctype-Name, z. B.
"html". - ProcessingInstruction: der Wert von
target.
Praktisch ist nodeName vor allem beim Durchlaufen gemischter Knotenlisten wie childNodes, weil die Eigenschaft anders als tagName auch für Text- und Kommentarknoten definiert ist. Um den Typ eines Knotens zu prüfen, ist nodeType meist zuverlässiger. nodeName eignet sich eher, um zwischen bestimmten Elementen zu unterscheiden.
Rückgabewert
"#text" oder "#comment".Beispiele
Knotennamen der Kindknoten auflisten
// HTML: <div id="box">Hallo <b>Welt</b><!-- Hinweis --></div>
const box = document.getElementById('box');
for (const node of box.childNodes) {
console.log(node.nodeName);
}
console.log(document.nodeName);
console.log(document.doctype?.nodeName);
Ereignisdelegation: Klicks nur auf Buttons auswerten
const toolbar = document.querySelector('.toolbar');
toolbar.addEventListener('click', (event) => {
const target = event.target;
// In HTML ist nodeName großgeschrieben
if (target.nodeName === 'BUTTON') {
console.log(`Aktion: ${target.dataset.action}`);
}
});
Robuster Vergleich in HTML und SVG
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
const div = document.createElement('div');
const isTag = (node, name) =>
node.nodeName.toLowerCase() === name.toLowerCase();
console.log(svg.nodeName, circle.nodeName, div.nodeName);
console.log(isTag(circle, 'CIRCLE'), isTag(div, 'div'));
Leere Textknoten herausfiltern
const list = document.querySelector('ul');
const relevant = [...list.childNodes].filter((node) =>
!(node.nodeName === '#text' && node.textContent.trim() === '')
);
console.log(relevant.map((n) => n.nodeName));
// Wichtig · Fallstricke
- Groß- und Kleinschreibung: In HTML-Dokumenten liefern HTML-Elemente großgeschriebene Namen (
"DIV"). SVG- und MathML-Elemente sowie Elemente in XML- bzw. XHTML-Dokumenten (application/xhtml+xml) behalten ihre Originalschreibweise. Wer robust vergleichen will, nutzttoLowerCase()oderlocalName, das bei HTML-Elementen immer kleingeschrieben ist. - Präfixe: Bei Elementen mit Namensraum-Präfix enthält
nodeNamedas Präfix ("xlink:href","svg:rect").localNameliefert den Namen ohne Präfix. - Typprüfung: Zur Unterscheidung von Knotentypen ist
node.nodeType === Node.TEXT_NODEeindeutiger als ein Vergleich mit"#text", dennnodeNameunterscheidet zum Beispiel nicht zwischen einem Element namens"#text"in XML und einem echten Textknoten. - Nur lesbar: Ein Element lässt sich nicht über
nodeNameumbenennen. Dafür muss man ein neues Element anlegen und die Kinder dorthin verschieben. - Kompatibilität: Wird von allen Browsern seit DOM Level 1 unterstützt, auch in Node.js-DOM-Implementierungen wie jsdom.