Signatur
Beschreibung
Das load-Ereignis wird auf einem SVGElement ausgelöst, sobald das Element im Browser vollständig geladen ist. Bei Elementen mit externen Ressourcen, also <image>, <script> oder <use> mit externem Verweis, bedeutet das: Die referenzierte Datei wurde erfolgreich geladen. Bei einem <svg>-Wurzelelement heißt es, dass das SVG-Dokument fertig aufgebaut ist. Das Ereignis entspricht dem normalen DOM-Ereignis load und hieß in älteren SVG-Spezifikationen SVGLoad.
Du kannst das Ereignis auf zwei Arten abfangen: mit element.addEventListener("load", handler) oder über die Eigenschaft element.onload = handler. Das Inline-Attribut onload="…" im Markup funktioniert auch. Der Handler bekommt ein einfaches Event-Objekt. Das Ereignis steigt nicht im DOM auf (kein Bubbling) und lässt sich nicht abbrechen.
Typische Einsatzfälle sind:
- ein SVG-
<image>erst nach dem Laden einblenden oder vermessen, zum Beispiel mitgetBBox(), - eine Animation starten, sobald die Grafik bereitsteht,
- Code ausführen, nachdem ein dynamisch eingefügtes SVG-
<script>geladen wurde.
Registriere den Listener bevor die Ressource geladen wird. Bei dynamisch erzeugten Elementen heißt das: vor dem Setzen von href bzw. vor dem Einfügen ins DOM.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignistyp, hier immer "load". |
|
| $handler Pflicht | (event: Event) => void | Callback, der nach dem Laden aufgerufen wird. event.target ist das geladene SVGElement. |
|
| $options | boolean | AddEventListenerOptions | false | Optionen wie { once: true }, damit der Handler nach dem ersten Aufruf automatisch entfernt wird. |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler bekommt ein Event-Objekt mit bubbles === false und cancelable === false.Beispiele
SVG-Bild dynamisch laden und nach dem Laden einblenden
const SVG_NS = 'http://www.w3.org/2000/svg';
const svg = document.querySelector('svg#galerie');
const img = document.createElementNS(SVG_NS, 'image');
img.setAttribute('width', '200');
img.setAttribute('height', '150');
img.style.opacity = '0';
// Listener VOR dem Setzen von href registrieren
img.addEventListener('load', (event) => {
event.target.style.transition = 'opacity .3s';
event.target.style.opacity = '1';
console.log('Bild geladen:', event.target.getAttribute('href'));
}, { once: true });
img.addEventListener('error', () => console.error('Bild konnte nicht geladen werden'));
img.setAttribute('href', '/bilder/foto.jpg');
svg.append(img);
onload-Eigenschaft statt addEventListener
const SVG_NS = 'http://www.w3.org/2000/svg';
const logo = document.createElementNS(SVG_NS, 'image');
logo.onload = () => {
const box = logo.getBBox();
console.log(`Logo bereit: ${box.width}×${box.height}`);
logo.onload = null; // Handler wieder entfernen
};
logo.setAttribute('width', '120');
logo.setAttribute('height', '40');
logo.setAttribute('href', '/logo.png');
document.querySelector('svg').append(logo);
Listener mit removeEventListener wieder abmelden
const img = document.querySelector('svg image#vorschau');
const onLoad = (event) => {
console.log('Vorschau geladen');
img.removeEventListener('load', onLoad);
};
img.addEventListener('load', onLoad);
// Neues Bild setzen – löst erneut ein load-Ereignis aus
img.setAttribute('href', '/bilder/vorschau-2.png');
Ladezustand als Promise abwarten
const loadSvgImage = (svg, url) => new Promise((resolve, reject) => {
const img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
img.addEventListener('load', () => resolve(img), { once: true });
img.addEventListener('error', () => reject(new Error(`Fehler: ${url}`)), { once: true });
img.setAttribute('href', url);
svg.append(img);
});
const main = async () => {
const svg = document.querySelector('svg');
const img = await loadSvgImage(svg, '/karte.png');
console.log('Karte eingefügt:', img.tagName);
};
main();
// Wichtig · Fallstricke
- Zeitpunkt der Registrierung: Ist das Ereignis schon ausgelöst worden, bevor der Listener angemeldet wurde, wird er nie aufgerufen. Das passiert etwa bei Bildern aus dem Cache. Registriere den Listener deshalb vor dem Setzen von
href, oder nutze das Inline-Attributonloadim Markup. - Inline-SVG in HTML: Ob und wann
loadauf einem<svg>-Element feuert, das direkt im HTML steht, ist zwischen den Browsern nicht einheitlich. Für „DOM ist bereit“ nimmst du besserDOMContentLoadedoderwindow-load. - Kein Bubbling:
loadsteigt nicht auf. Eine Ereignisdelegation über ein Elternelement funktioniert nur in der Capture-Phase:addEventListener('load', fn, true). - Fehlerfall: Schlägt das Laden fehl, kommt statt
loaddas Ereigniserror. Registriere beide. - Veraltet: Der Ereignisname
SVGLoadaus SVG 1.1 wird nicht mehr unterstützt. Verwendeload. - Sicherheit: Inline-Handler wie
onload="…"in SVG-Dateien werden bei strikter CSP (ohne'unsafe-inline') blockiert. Nicht vertrauenswürdige SVG-Dateien mitonload-Attributen sind ein bekannter XSS-Weg. Bereinige sie deshalb, bevor du sie perinnerHTMLeinfügst.