Signatur
Beschreibung
Die Eigenschaft namespaceURI eines CSSNamespaceRule-Objekts liefert den URI, der in einer @namespace-At-Regel eines Stylesheets angegeben ist, zum Beispiel http://www.w3.org/2000/svg bei @namespace svg url(http://www.w3.org/2000/svg);. Zurückgegeben wird nur der reine URI-Text, ohne url() und ohne Anführungszeichen.
Sinnvoll ist die Eigenschaft, wenn man Stylesheets zur Laufzeit untersucht: etwa in Entwicklerwerkzeugen, CSS-Analysetools oder beim Prüfen, ob ein Stylesheet Selektoren für SVG-, MathML- oder XHTML-Elemente mit Namensraum-Präfix verwendet. Zusammen mit CSSNamespaceRule.prefix lässt sich so jede Zuordnung von Präfix zu Namensraum auslesen.
Die Eigenschaft ist schreibgeschützt. Soll ein Namensraum geändert werden, muss die Regel über CSSStyleSheet.deleteRule() entfernt und über insertRule() neu eingefügt werden. Das ist nur möglich, solange das Stylesheet ausschließlich @import- und @namespace-Regeln enthält.
Rückgabewert
"http://www.w3.org/1999/xhtml". Wurde url() verwendet, wird nur der enthaltene URI zurückgegeben.Beispiele
Namensraum-URIs eines Stylesheets auslesen
const style = document.createElement('style');
style.textContent = `
@namespace url(http://www.w3.org/1999/xhtml);
@namespace svg url(http://www.w3.org/2000/svg);
svg|circle { fill: tomato; }
`;
document.head.append(style);
for (const rule of style.sheet.cssRules) {
if (rule instanceof CSSNamespaceRule) {
console.log(`Präfix: "${rule.prefix}" → ${rule.namespaceURI}`);
}
}
Prüfen, ob ein Stylesheet einen SVG-Namensraum deklariert
const SVG_NS = 'http://www.w3.org/2000/svg';
const nutztSvgNamespace = (sheet) =>
Array.from(sheet.cssRules).some(
(rule) => rule instanceof CSSNamespaceRule && rule.namespaceURI === SVG_NS
);
const sheet = new CSSStyleSheet();
sheet.replaceSync('@namespace svg url("http://www.w3.org/2000/svg");');
console.log(nutztSvgNamespace(sheet));
Schreibschutz: Namensraum per Regel-Austausch ändern
const sheet = new CSSStyleSheet();
sheet.replaceSync('@namespace m url(http://example.com/alt);');
const rule = sheet.cssRules[0];
rule.namespaceURI = 'http://www.w3.org/1998/Math/MathML'; // wird ignoriert
console.log(rule.namespaceURI);
// Stattdessen Regel ersetzen
sheet.deleteRule(0);
sheet.insertRule('@namespace m url(http://www.w3.org/1998/Math/MathML);', 0);
console.log(sheet.cssRules[0].namespaceURI);
// Wichtig · Fallstricke
- Schreibgeschützt: Zuweisungen werden im nicht-strikten Modus stillschweigend ignoriert und lösen im Strict Mode (z. B. in ES-Modulen) einen
TypeErroraus. @namespace-Regeln müssen nach allen@charset- und@import-Regeln und vor allen anderen Regeln stehen, sonst werden sie ignoriert und tauchen nicht incssRulesauf.- Bei Stylesheets von anderen Ursprüngen (Cross-Origin) wirft der Zugriff auf
sheet.cssRuleseinenSecurityError, sofern kein passender CORS-Header vorhanden ist. - Nicht verwechseln mit
Element.namespaceURI, das den Namensraum eines DOM-Elements liefert. - Wird von allen modernen Browsern unterstützt. Konstruierbare Stylesheets (
new CSSStyleSheet()) setzen neuere Browser voraus;replaceSync()verbietet allerdings@import, nicht aber@namespace.