Signatur
Beschreibung
Die schreibgeschützte Eigenschaft Element.prefix liefert den Teil des qualifizierten Namens eines Elements, der vor dem Doppelpunkt steht. Bei einem Element <xsl:template> ist prefix also "xsl", localName ist "template" und namespaceURI ist die URI, an die das Präfix gebunden ist.
Wichtig ist die Eigenschaft vor allem bei der Arbeit mit XML-Dokumenten (z. B. aus DOMParser mit "application/xml", SOAP-, RSS-, Atom- oder XSLT-Daten) und mit Elementen, die per document.createElementNS() mit einem qualifizierten Namen wie "svg:rect" erzeugt wurden. Wenn du einen Elementnamen verlustfrei rekonstruieren oder ein Dokument serialisieren willst, kombinierst du prefix und localName.
In normalen HTML-Dokumenten ist prefix praktisch immer null: HTML-, SVG- und MathML-Elemente, die der HTML-Parser erzeugt, bekommen zwar den passenden Namensraum, aber kein Präfix. Für den Vergleich von Namensräumen solltest du deshalb immer namespaceURI verwenden – das Präfix ist nur ein frei wählbarer Kurzname und kann sich zwischen Dokumenten unterscheiden.
Rückgabewert
null, wenn das Element kein Präfix besitzt.Beispiele
Präfixe in einem geparsten XML-Dokument auslesen
const xml = `<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom"
xmlns:media="http://search.yahoo.com/mrss/">
<entry>
<title>Hallo</title>
<media:thumbnail url="bild.jpg"/>
</entry>
</feed>`;
const doc = new DOMParser().parseFromString(xml, 'application/xml');
for (const el of doc.querySelectorAll('*')) {
console.log(el.tagName, '→ prefix:', el.prefix, '| localName:', el.localName);
}
Präfix bei createElementNS mit qualifiziertem Namen
const SVG_NS = 'http://www.w3.org/2000/svg';
const mitPraefix = document.createElementNS(SVG_NS, 'svg:rect');
const ohnePraefix = document.createElementNS(SVG_NS, 'rect');
console.log(mitPraefix.prefix, mitPraefix.localName);
console.log(ohnePraefix.prefix, ohnePraefix.localName);
// Namensraum ist in beiden Fällen identisch
console.log(mitPraefix.namespaceURI === ohnePraefix.namespaceURI);
HTML-Elemente haben kein Präfix
const div = document.createElement('div');
console.log(div.prefix); // null
// Auch ein Doppelpunkt im HTML-Markup erzeugt KEIN Präfix
const host = document.createElement('div');
host.innerHTML = '<svg:rect></svg:rect>';
const el = host.firstElementChild;
console.log(el.prefix, '|', el.localName);
Qualifizierten Namen sicher rekonstruieren
const qualifiedName = (el) =>
el.prefix ? `${el.prefix}:${el.localName}` : el.localName;
const doc = new DOMParser().parseFromString(
'<root xmlns:x="urn:beispiel"><x:item/><plain/></root>',
'application/xml'
);
const namen = [...doc.documentElement.children].map(qualifiedName);
console.log(namen);
// Wichtig · Fallstricke
- Schreibgeschützt: In älteren DOM-Spezifikationen (DOM Level 2/3) lag
prefixaufNodeund war beschreibbar. Heute steht die Eigenschaft nur noch aufElementundAttrund ist schreibgeschützt. Eine Zuweisung wird im nicht-strikten Modus stillschweigend ignoriert und löst im strikten Modus einenTypeErroraus. Das Präfix kannst du nur beim Erzeugen übercreateElementNS()festlegen. - Nicht zum Namensraum-Vergleich verwenden: Präfixe sind frei wählbar (
svg:,s:, …). Prüfe stattdessenel.namespaceURI. - HTML-Parser: In HTML-Dokumenten erzeugt Markup wie
<svg:rect>kein Präfix. Der Doppelpunkt wird Teil vonlocalName. - Groß-/Kleinschreibung:
prefixgibt die Schreibweise unverändert zurück, anders alstagName, das in HTML-Dokumenten für HTML-Elemente in Großbuchstaben steht. - Kompatibilität: Wird von allen aktuellen Browsern unterstützt. Die Verschiebung von
NodeaufElementkam mit Chrome 46 und Firefox 48. Sehr alter Code, dernode.prefixbei Text- oder anderen Nicht-Element-Knoten abfragt, bekommt heuteundefined.