Signatur
Beschreibung
SVGScriptElement ist die DOM-Schnittstelle für das <script>-Element im SVG-Namensraum (http://www.w3.org/2000/svg). Sie erbt von SVGElement und übernimmt über das Mixin SVGURIReference die Eigenschaft href. Mit diesem Element bindet man JavaScript direkt in ein SVG-Dokument ein, etwa bei eigenständigen, interaktiven .svg-Dateien.
Die Schnittstelle hat nur wenige eigene Eigenschaften:
type(string): spiegelt das Attributtypewider, z. B."text/javascript"oder"module".crossOrigin(string | null): spiegelt das Attributcrossoriginwider ("anonymous"oder"use-credentials") und steuert CORS-Anfragen für externe Skripte.href(SVGAnimatedString, schreibgeschützt): liefert die Adresse des externen Skripts. Den aktuellen Wert findet man inhref.baseValbzw.href.animVal.
Du nutzt diese Schnittstelle vor allem, wenn du innerhalb eines SVG-Dokuments Skripte dynamisch nachladen oder vorhandene <script>-Elemente untersuchen willst. Ein SVG-Skriptelement legst du immer mit document.createElementNS() und dem SVG-Namensraum an. document.createElement("script") erzeugt dagegen ein HTMLScriptElement.
Rückgabewert
document.createElementNS("http://www.w3.org/2000/svg", "script") oder über DOM-Abfragen auf vorhandene SVG-<script>-Elemente.Beispiele
SVG-Skriptelement erzeugen und externes Skript nachladen
const SVG_NS = 'http://www.w3.org/2000/svg';
// Das SVG in der Seite (oder das Wurzelelement einer .svg-Datei)
const svg = document.querySelector('svg') ?? document.body.appendChild(document.createElementNS(SVG_NS, 'svg'));
const script = document.createElementNS(SVG_NS, 'script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('href', '/js/diagramm-interaktion.js');
script.crossOrigin = 'anonymous';
script.addEventListener('load', () => console.log('Skript geladen:', script.href.baseVal));
script.addEventListener('error', () => console.error('Skript konnte nicht geladen werden'));
svg.appendChild(script);
console.log(script instanceof SVGScriptElement);
Inline-Skript in ein SVG einfügen
const SVG_NS = 'http://www.w3.org/2000/svg';
const svg = document.querySelector('svg');
const script = document.createElementNS(SVG_NS, 'script');
script.type = 'text/javascript';
// textContent statt innerHTML, damit der Code als Text eingefügt wird
script.textContent = "console.log('Hallo aus dem SVG-Skript');";
svg.appendChild(script); // wird beim Einfügen ausgeführt
Vorhandene SVG-Skripte untersuchen
const svgScripts = [...document.querySelectorAll('svg script')]
.filter((el) => el instanceof SVGScriptElement);
for (const s of svgScripts) {
console.log({
typ: s.type || '(Standard)',
quelle: s.href.baseVal || '(inline)',
cors: s.crossOrigin
});
}
// Wichtig · Fallstricke
Sicherheit: SVG-Dateien können über <script> ausführbaren Code enthalten. Wenn Nutzer SVGs hochladen dürfen und diese direkt (inline oder als eigenes Dokument vom eigenen Origin) ausgeliefert werden, entsteht eine XSS-Lücke. Bereinige hochgeladene SVGs deshalb, zum Beispiel mit DOMPurify, liefere sie von einer separaten Domain aus oder setze einen strengen Content-Security-Policy-Header. Für SVG-Skripte gilt die CSP genauso wie für HTML-Skripte, etwa script-src und Nonces.
- SVGs, die per
<img>oder als CSS-background-imageeingebunden sind, führen keine Skripte aus. Das passiert nur inline, per<object>/<iframe>oder beim direkten Aufruf der Datei. - Skripte, die über
innerHTMLeingefügt werden, werden nicht ausgeführt. Lege das Element deshalb mitcreateElementNS()an. xlink:hrefist veraltet. Verwende das einfache Attributhref. Ältere Safari-Versionen brauchen unter Umständen nochxlink:href.hrefist einSVGAnimatedStringund kein String. Lies den Wert überhref.baseValaus. Anders als beiHTMLScriptElementgibt es keine Eigenschaftenasync,deferodersrc.- Die Schnittstelle wird in allen modernen Browsern unterstützt.