Start · Sprachen · JavaScript · Referenz · SVGAnimationElement: endEvent

SVGAnimationElement: endEvent

Ereignis

Wird an einem SVG-Animationselement (<code>&lt;animate&gt;</code>, <code>&lt;animateTransform&gt;</code>, <code>&lt;set&gt;</code> …) ausgelöst, sobald dessen aktive Dauer endet.

seit JavaScript SVG 1.1 / SMIL – unterstützt in Chrome, Edge, Fire Kategorie: webapi

Signatur

animationElement.addEventListener("endEvent", handler)

Beschreibung

Das Ereignis endEvent gehört zur Schnittstelle SVGAnimationElement. Es wird ausgelöst, wenn eine SMIL-Animation wie <animate>, <animateMotion>, <animateTransform> oder <set> das Ende ihrer aktiven Dauer erreicht, also nach Ablauf aller Wiederholungen (repeatCount/repeatDur) oder zu einem über das Attribut end festgelegten Zeitpunkt.

Einen Handler registrierst du entweder mit addEventListener("endEvent", handler) oder über die Eigenschaft onend bzw. das gleichnamige Markup-Attribut onend="…". Das übergebene Ereignisobjekt ist ein TimeEvent. Es bietet unter anderem detail und view. Das Ereignis steigt nicht im DOM-Baum auf (keine Bubbling-Phase) und lässt sich nicht abbrechen.

Typische Einsatzfälle sind das Verketten von Animationen (die nächste startet per beginElement()), das Aufräumen oder Entfernen von Elementen nach einer Einblend- oder Ausblend-Animation und das Aktualisieren des Zustands der Bedienoberfläche, zum Beispiel einen Button wieder aktivieren. Für reine SVG-Verkettungen reicht oft schon deklarativ begin="andereAnimation.end", ganz ohne JavaScript.

Das Ereignis feuert sowohl bei normalem (geplantem oder interaktivem) Ablauf der Zeitachse als auch dann, wenn die Animation per DOM-Methode wie endElement() beendet wird. Am einfachen Ende jeder einzelnen Wiederholung wird es dagegen nicht ausgelöst, dafür gibt es repeatEvent.

Parameter

Name Typ Default Beschreibung
$type Pflicht string Ereignistyp, exakt "endEvent" (Groß-/Kleinschreibung beachten). Bei der Handler-Eigenschaft heißt es dagegen onend.
$handler Pflicht (event: TimeEvent) => void Callback, das beim Ende der aktiven Dauer aufgerufen wird. Er erhält ein TimeEvent mit target (dem Animationselement), detail und view.
$options boolean | AddEventListenerOptions false Optionen wie once, signal oder capture, wie bei addEventListener üblich.

Rückgabewert

Typ
void
Beschreibung
addEventListener gibt nichts zurück. Der Handler erhält ein TimeEvent-Objekt.

Beispiele

Ende einer Animation mit addEventListener erkennen

const NS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(NS, 'svg');
svg.setAttribute('width', '200');
svg.setAttribute('height', '100');

const rect = document.createElementNS(NS, 'rect');
rect.setAttribute('width', '20');
rect.setAttribute('height', '20');
rect.setAttribute('fill', 'teal');

const anim = document.createElementNS(NS, 'animate');
anim.setAttribute('attributeName', 'x');
anim.setAttribute('from', '0');
anim.setAttribute('to', '180');
anim.setAttribute('dur', '1s');
anim.setAttribute('repeatCount', '2');
anim.setAttribute('fill', 'freeze');

anim.addEventListener('beginEvent', () => console.log('Animation gestartet'));
anim.addEventListener('repeatEvent', (e) => console.log('Wiederholung', e.detail));
anim.addEventListener('endEvent', (e) => {
  console.log('Animation beendet:', e.type, e.target.localName);
});

rect.append(anim);
svg.append(rect);
document.body.append(svg);
Animation gestartet Wiederholung 1 Animation beendet: endEvent animate

Handler über die onend-Eigenschaft setzen und wieder entfernen

// <svg><circle r="10" cx="20" cy="20"><animate id="pulse" attributeName="r" from="10" to="18" dur="0.5s" begin="indefinite"/></circle></svg>
const pulse = document.getElementById('pulse');

pulse.onend = () => {
  console.log('Puls fertig');
  pulse.onend = null; // Handler nach dem ersten Mal entfernen
};

pulse.beginElement();
Puls fertig

Animationen verketten und Listener mit removeEventListener abmelden

// <svg> mit zwei Animationen: #fadeOut (begin="indefinite") und #slideIn (begin="indefinite")
const fadeOut = document.getElementById('fadeOut');
const slideIn = document.getElementById('slideIn');
const button = document.querySelector('#start');

const onFadeEnd = () => {
  slideIn.beginElement(); // Folgeanimation starten
  fadeOut.removeEventListener('endEvent', onFadeEnd);
};

button.addEventListener('click', () => {
  button.disabled = true;
  fadeOut.addEventListener('endEvent', onFadeEnd);
  slideIn.addEventListener('endEvent', () => {
    button.disabled = false;
    console.log('Sequenz abgeschlossen');
  }, { once: true });
  fadeOut.beginElement();
});
Sequenz abgeschlossen

Auf das Ende als Promise warten

const waitForEnd = (animEl) =>
  new Promise((resolve) => {
    animEl.addEventListener('endEvent', resolve, { once: true });
  });

const run = async () => {
  const anim = document.querySelector('#grow');
  anim.beginElement();
  const evt = await waitForEnd(anim);
  console.log('Fertig nach', anim.getCurrentTime().toFixed(1), 's Dokumentzeit');
};

run();
Fertig nach 1.0 s Dokumentzeit