Start · Sprachen · JavaScript · Referenz · SVGDiscardElement

SVGDiscardElement

Schnittstelle

DOM-Schnittstelle für das veraltete SVG-Element <code>&lt;discard&gt;</code>. Es entfernt ein Zielelement zu einem festgelegten Zeitpunkt aus dem DOM.

seit JavaScript Veraltet/nicht standardisiert: nur in Chromium-Bro deprecated seit ja Kategorie: webapi

Signatur

interface SVGDiscardElement extends SVGAnimationElement

Beschreibung

SVGDiscardElement steht im DOM für das SVG-Element <discard>. Das Element kommt aus SVG Tiny 1.2 und wurde im Entwurf „SVG Animations Level 2“ aufgegriffen. Es sollte Speicher sparen: Zu einem bestimmten Zeitpunkt, den das Attribut begin festlegt, wird das Zielelement samt Kindern endgültig aus dem Dokument entfernt. Ohne href ist das Ziel das Elternelement. Der Anwendungsfall waren lange SMIL-Animationen, zum Beispiel Laufschriften oder Diashows, bei denen abgelaufene Teile nicht im Speicher bleiben sollen.

Die Schnittstelle definiert keine eigenen Eigenschaften oder Methoden. Alles erbt sie von SVGAnimationElement, zum Beispiel targetElement, getStartTime(), beginElement() und beginElementAt(). Außerdem erbt sie von SVGElement, Element, Node und EventTarget.

In der Praxis sollten Sie <discard> nicht mehr verwenden. Das Element steht nicht in SVG 2 und wird von den Browsern unterschiedlich unterstützt. Entfernen Sie Elemente lieber per JavaScript mit Element.remove(), zeitgesteuert über setTimeout(), über Animationsereignisse wie endEvent oder über die Web Animations API mit animation.finished.

Rückgabewert

Typ
SVGDiscardElement
Beschreibung
Instanzen entstehen durch das Markup <discard> im SVG oder durch document.createElementNS('http://www.w3.org/2000/svg', 'discard'). Einen öffentlichen Konstruktor gibt es nicht.

Beispiele

Unterstützung im Browser prüfen

// Gibt es das Interface überhaupt?
const hatDiscard = typeof window.SVGDiscardElement === 'function';

// Erzeugt der Browser ein echtes SVGDiscardElement oder nur ein generisches SVGElement?
const el = document.createElementNS('http://www.w3.org/2000/svg', 'discard');
console.log('Interface vorhanden:', hatDiscard);
console.log('Klasse:', el.constructor.name);
Interface vorhanden: true Klasse: SVGDiscardElement (in Firefox/Safari: false bzw. SVGElement)

Deklaratives Entfernen per Markup (veraltet)

// SVG mit einem Hinweis, der nach 3 Sekunden verschwinden soll
document.body.insertAdjacentHTML('beforeend', `
  <svg id="bühne" width="200" height="60" xmlns="http://www.w3.org/2000/svg">
    <text id="hinweis" x="10" y="35">Willkommen!</text>
    <discard href="#hinweis" begin="3s" />
  </svg>`);

const discard = document.querySelector('#bühne discard');
console.log(discard instanceof (window.SVGDiscardElement ?? Object));

setTimeout(() => {
  console.log('Hinweis noch vorhanden?', !!document.getElementById('hinweis'));
}, 3500);
true Hinweis noch vorhanden? false (nur bei Unterstützung von <discard>)

Robuste Alternative mit Fallback

// Entfernt ein SVG-Element nach 'ms' Millisekunden. Nutzt <discard>, falls vorhanden, sonst JavaScript.
const verwerfeNach = (ziel, ms) => {
  if (typeof window.SVGDiscardElement === 'function') {
    const d = document.createElementNS('http://www.w3.org/2000/svg', 'discard');
    d.setAttribute('href', `#${ziel.id}`);
    d.setAttribute('begin', `${ms}ms`);
    ziel.ownerSVGElement.append(d);
  } else {
    setTimeout(() => ziel.remove(), ms);
  }
};

const kreis = document.querySelector('svg circle#blase');
if (kreis) verwerfeNach(kreis, 2000);

// Wichtig · Fallstricke

Veraltet und uneinheitlich unterstützt: <discard> steht nicht in SVG 2. Chromium-basierte Browser setzen das Element teilweise um. Firefox und Safari erzeugen stattdessen ein generisches SVGElement ohne Wirkung. Für neuen Code nicht verwenden.

  • Das Entfernen ist endgültig. Wenn die Zeitleiste zurückspringt, etwa mit setCurrentTime(), kommt das Element nicht zurück.
  • begin bezieht sich auf die Dokument-Zeitleiste des SVG. Pausierte Animationen (pauseAnimations()) verzögern das Entfernen.
  • Ohne href wird das Elternelement entfernt, nicht das <discard> selbst. Das führt leicht zu ungewollt verschwundenen Gruppen.
  • Prüfen Sie die Unterstützung immer über typeof SVGDiscardElement oder constructor.name. Ein erfolgreiches createElementNS(…, 'discard') sagt nichts über die Unterstützung aus.
  • Referenzen im Code auf ein entferntes Zielelement bleiben erhalten. Zeigen solche Variablen noch auf das Element, gibt der Garbage Collector den Speicher nicht frei.