Signatur
Beschreibung
Die Methode insertItemBefore() des Interfaces SVGLengthList fügt ein neues Längenobjekt (SVGLength) vor dem Eintrag mit dem angegebenen Index ein. Alle Einträge ab diesem Index rücken um eine Position nach hinten. Mit dem Index 0 wird am Anfang eingefügt; ist der Index größer oder gleich numberOfItems, landet das Element am Ende der Liste.
Längenlisten tauchen in SVG vor allem bei den Attributen x, y, dx und dy von <text> und <tspan> auf. Über element.x.baseVal erhält man die veränderbare Liste; Änderungen daran werden sofort ins zugehörige Attribut zurückgeschrieben. So lassen sich einzelne Zeichen einer Textzeile gezielt positionieren, ohne das Attribut als Zeichenkette zusammenbauen und parsen zu müssen.
Ein neues SVGLength-Objekt erzeugt man über SVGSVGElement.createSVGLength() und legt dann Wert und Einheit mit newValueSpecifiedUnits() oder über die Eigenschaft value fest. Gehört das übergebene Objekt bereits zu einer anderen Liste, fügt die Methode nach SVG 2 eine Kopie ein – deshalb sollte man immer mit dem Rückgabewert weiterarbeiten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $newItem Pflicht | SVGLength | Das einzufügende Längenobjekt, typischerweise erzeugt mit svg.createSVGLength(). |
|
| $index Pflicht | number | Position (ab 0), vor der eingefügt wird. Werte ab numberOfItems hängen das Element ans Ende an. Wird zu einem vorzeichenlosen Ganzzahlwert (unsigned long) konvertiert. |
Rückgabewert
SVGLength-Objekt. Nach SVG 2 kann das eine Kopie von newItem sein, wenn dieses bereits zu einer Liste gehörte.Beispiele
Länge am Anfang der x-Liste eines Textes einfügen
const NS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(NS, 'svg');
const text = document.createElementNS(NS, 'text');
text.setAttribute('x', '20 30');
text.textContent = 'ABC';
svg.append(text);
document.body.append(svg);
const list = text.x.baseVal;
const len = svg.createSVGLength();
len.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_NUMBER, 10);
list.insertItemBefore(len, 0);
console.log(list.numberOfItems);
console.log(text.getAttribute('x'));
Zu großer Index hängt ans Ende an
const NS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(NS, 'svg');
const text = document.createElementNS(NS, 'text');
text.setAttribute('y', '5 15');
svg.append(text);
const len = svg.createSVGLength();
len.value = 25;
// Index 99 existiert nicht – das Element landet am Ende
const inserted = text.y.baseVal.insertItemBefore(len, 99);
console.log(inserted.value);
console.log(text.getAttribute('y'));
Zeichenpositionen schrittweise aufbauen
const NS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(NS, 'svg');
const text = document.createElementNS(NS, 'text');
text.textContent = 'Hallo';
svg.append(text);
document.body.append(svg);
const list = text.x.baseVal;
list.clear();
// Fünf Positionen im Abstand von 12 px – jeweils vorne einfügen
for (let i = 4; i >= 0; i--) {
const len = svg.createSVGLength();
len.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_NUMBER, 10 + i * 12);
list.insertItemBefore(len, 0);
}
console.log(text.getAttribute('x'));
// Wichtig · Fallstricke
- Nur auf
baseValanwenden: Die ListeanimValist schreibgeschützt; ein Aufruf löst dort eineDOMExceptionvom TypNoModificationAllowedErroraus. - Rückgabewert nutzen: Gehört
newItembereits zu einer anderen Liste, wurde es nach SVG 1.1 aus dieser entfernt. Nach SVG 2 (aktuelle Browser) wird dagegen eine Kopie eingefügt. Spätere Änderungen am ursprünglichen Objekt wirken sich dann nicht auf die Liste aus. - Wer ein Objekt übergibt, das kein
SVGLengthist, bekommt einenTypeError. - Einheiten beeinflussen die Serialisierung:
SVG_LENGTHTYPE_PXwird im Attribut als10pxgeschrieben,SVG_LENGTHTYPE_NUMBERals10. - Die Methode wird von allen modernen Browsern unterstützt. Die Eigenschaft
lengthals Alias fürnumberOfItemskam erst mit SVG 2 hinzu und fehlt in sehr alten Engines.