Signatur
Beschreibung
SVGAElement steht für ein <a>-Element im SVG-Namensraum (http://www.w3.org/2000/svg). Es funktioniert wie ein Hyperlink: Beliebige SVG-Grafikelemente wie Formen, Texte oder Gruppen, die darin liegen, werden anklickbar und führen zu einer URL. Die Schnittstelle erbt von SVGGraphicsElement und damit auch von SVGElement, Element, Node und EventTarget.
Die wichtigsten Eigenschaften:
href(SVGAnimatedString, ausSVGURIReference): Linkziel. Gelesen und geschrieben wird überhref.baseVal, der aktuell animierte Wert steht inhref.animVal.target(SVGAnimatedString): Zielkontext wie_blankoder_self, ebenfalls übertarget.baseVal.download,hreflang,ping,referrerPolicy,rel,type(jeweilsstring): spiegeln die gleichnamigen Attribute wider, genau wie beiHTMLAnchorElement.relList(DOMTokenList): Die Werte vonrelals Token-Liste, bequem zu bearbeiten mitadd(),remove()undcontains().
Du brauchst die Schnittstelle, wenn du Links in Inline-SVG dynamisch erzeugst oder änderst, zum Beispiel für interaktive Diagramme, Karten oder Infografiken mit klickbaren Bereichen. Wichtig: SVG-Elemente musst du mit document.createElementNS() und dem SVG-Namensraum anlegen. Mit createElement("a") bekommst du dagegen ein HTMLAnchorElement.
Rückgabewert
document.createElementNS("http://www.w3.org/2000/svg", "a") oder von querySelector("svg a") zurückgegeben.Beispiele
SVG-Link dynamisch erzeugen
const SVG_NS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(SVG_NS, 'svg');
svg.setAttribute('viewBox', '0 0 200 100');
const link = document.createElementNS(SVG_NS, 'a');
link.setAttribute('href', 'https://programmierung.net/');
link.setAttribute('target', '_blank');
link.relList.add('noopener', 'noreferrer');
const circle = document.createElementNS(SVG_NS, 'circle');
circle.setAttribute('cx', '50');
circle.setAttribute('cy', '50');
circle.setAttribute('r', '40');
circle.setAttribute('fill', 'teal');
link.append(circle);
svg.append(link);
document.body.append(svg);
console.log(link instanceof SVGAElement);
console.log(link.href.baseVal);
console.log(link.rel);
Linkziel und Fenster über SVGAnimatedString ändern
// <svg><a id="karte-link" href="/region/nord"><rect width="80" height="40"/></a></svg>
const link = document.querySelector('#karte-link');
console.log(typeof link.href); // kein String!
console.log(link.href.baseVal);
link.href.baseVal = '/region/sued';
link.target.baseVal = '_self';
console.log(link.getAttribute('href'));
console.log(link.target.baseVal);
Klicks auf SVG-Links abfangen (z. B. für SPA-Routing)
const svg = document.querySelector('svg.diagramm');
svg.addEventListener('click', (event) => {
const link = event.target.closest('a');
if (!(link instanceof SVGAElement)) return;
const url = new URL(link.href.baseVal, location.href);
if (url.origin === location.origin) {
event.preventDefault();
history.pushState({}, '', url.pathname);
console.log('Navigiere intern zu', url.pathname);
}
});
Download-Link für eine Datei in SVG
const SVG_NS = 'http://www.w3.org/2000/svg';
const blob = new Blob(['Region;Wert\nNord;42\n'], { type: 'text/csv' });
const link = document.createElementNS(SVG_NS, 'a');
link.setAttribute('href', URL.createObjectURL(blob));
link.download = 'daten.csv';
link.type = 'text/csv';
const text = document.createElementNS(SVG_NS, 'text');
text.setAttribute('x', '10');
text.setAttribute('y', '20');
text.textContent = 'CSV herunterladen';
link.append(text);
document.querySelector('svg').append(link);
console.log(link.download);
// Wichtig · Fallstricke
hrefist kein String: Anders als beiHTMLAnchorElement.hrefliefertSVGAElement.hrefeinSVGAnimatedString. Mitlink.href = '...'änderst du nichts. Verwendelink.href.baseValodersetAttribute('href', ...). Außerdem wird der Wert nicht zu einer absoluten URL aufgelöst, bei Bedarf hilftnew URL(link.href.baseVal, location.href). Fürtargetgilt dasselbe.- Namensraum:
document.createElement('a')erzeugt auch innerhalb von SVG immer ein HTML-Element, das im SVG weder angezeigt wird noch als Link funktioniert. Nimm immercreateElementNS('http://www.w3.org/2000/svg', 'a'). In CSS undquerySelectoristazweideutig, grenze die Auswahl daher über den Kontext ein, zum Beispiel mitsvg a. xlink:hrefist veraltet: Ältere SVG-Dateien nutzenxlink:href. Moderne Browser unterstützen das einfachehref(SVG 2). Für sehr alte Umgebungen (z. B. Safari vor Version 12) kannst du zusätzlichsetAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', url)setzen.- Sicherheit (XSS): Wie HTML-Links führen auch SVG-Links
javascript:-URLs aus. Setze nie ungeprüfte Benutzereingaben alshref. Prüfe das Protokoll (z. B. nurhttps:zulassen). Hochgeladene SVG-Dateien, die inline eingebunden werden, sind ein bekannter XSS-Weg. Bereinige sie vorher, etwa mit DOMPurify. Beitarget="_blank"solltest durel="noopener"setzen, auch wenn moderne Browser das inzwischen standardmäßig so behandeln. - Kompatibilität: Die Schnittstelle an sich und
href/targetfunktionieren in allen Browsern.download,rel,relList,referrerPolicy,hreflang,typeundpingkamen später hinzu und werden je nach Browser-Version unterschiedlich unterstützt. Prüfe vor der Nutzung, ob die Eigenschaft existiert ('relList' in link). - Links in einem SVG, das per
<img>oder als CSS-Hintergrund eingebunden ist, sind nicht klickbar. Dafür muss das SVG inline oder per<object>/<iframe>eingebunden sein.