Signatur
Beschreibung
SVGPointList ist die DOM-Darstellung des Attributs points der Elemente <polyline> und <polygon>. Über SVGPolylineElement.points bzw. SVGPolygonElement.points bekommst du eine lebende Liste. Änderungen an der Liste oder an ihren Punkten schreiben sich sofort in das Attribut zurück und verändern die Darstellung. Die Eigenschaft animatedPoints liefert dagegen eine schreibgeschützte Liste mit dem aktuell animierten Zustand.
Die Schnittstelle arbeitet mit einem eigenen, listenartigen API statt mit Array-Methoden:
- Eigenschaften:
lengthundnumberOfItems– beide geben die Anzahl der Punkte an. - Methoden:
clear(),initialize(newItem),getItem(index),insertItemBefore(newItem, index),replaceItem(newItem, index),removeItem(index)undappendItem(newItem). - In modernen Browsern kannst du auch per Index zugreifen (
list[0]).
Du nutzt SVGPointList, wenn du Linienzüge oder Polygone dynamisch aufbauen willst, z. B. für Live-Diagramme, Zeichenwerkzeuge oder Sparklines. Dann musst du den points-String nicht jedes Mal neu zusammensetzen und parsen. Einen eigenen Konstruktor gibt es nicht. Neue Punkte erzeugst du mit svgElement.createSVGPoint() oder in neueren Browsern mit new DOMPoint(x, y).
Rückgabewert
SVGPolylineElement.points, SVGPolygonElement.points (lebende, veränderbare Liste) und animatedPoints (schreibgeschützt) geliefert.Beispiele
Punkte einer Polylinie auslesen
const svgNS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(svgNS, 'svg');
const line = document.createElementNS(svgNS, 'polyline');
line.setAttribute('points', '0,0 50,20 100,10');
svg.append(line);
document.body.append(svg);
const points = line.points; // SVGPointList
console.log(points.numberOfItems);
for (let i = 0; i < points.numberOfItems; i++) {
const p = points.getItem(i);
console.log(`Punkt ${i}: ${p.x}/${p.y}`);
}
Live-Sparkline: Punkte anhängen und alte entfernen
const svg = document.querySelector('svg');
const line = svg.querySelector('polyline');
const MAX = 20;
let x = 0;
const addValue = (value) => {
const p = svg.createSVGPoint(); // funktioniert in allen Browsern
p.x = x;
p.y = 100 - value;
x += 5;
line.points.appendItem(p);
if (line.points.numberOfItems > MAX) {
line.points.removeItem(0); // ältesten Punkt verwerfen
}
};
setInterval(() => addValue(Math.random() * 100), 500);
Punkt ersetzen, einfügen und Liste zurücksetzen
const polygon = document.querySelector('polygon');
const list = polygon.points;
const a = new DOMPoint(10, 10);
list.initialize(a); // leert die Liste, a ist danach der einzige Punkt
list.appendItem(new DOMPoint(90, 10));
list.insertItemBefore(new DOMPoint(50, 90), 1);
list.replaceItem(new DOMPoint(10, 20), 0);
console.log(polygon.getAttribute('points'));
list.clear();
console.log(list.length);
// Wichtig · Fallstricke
- Lebende Liste: Die Punkte werden per Referenz zurückgegeben.
list.getItem(0).x = 5ändert das Element sofort. Brauchst du eine unabhängige Kopie, schreibst du z. B.Array.from(list, p => ({ x: p.x, y: p.y })). - Einträge werden kopiert: Nach SVG 2 werden Punkte beim Einfügen kopiert, wenn sie schon zu einer anderen Liste gehören. In älteren Implementierungen (SVG 1.1) wurden sie dabei aus der ursprünglichen Liste entfernt.
- Fehler:
getItem,replaceItemundremoveItemwerfen einenIndexSizeError, wenn der Index außerhalb der Liste liegt. BeiinsertItemBeforewird ein zu großer Index dagegen als „anhängen“ behandelt. Schreibzugriffe aufanimatedPointswerfen einenNoModificationAllowedError. - Kompatibilität: Die Schnittstelle an sich wird überall unterstützt.
lengthund der Zugriff per Index (list[i]) sind neuer (SVG 2). Ob BrowserDOMPointstattSVGPointals Eintrag annehmen, ist uneinheitlich. Am sichersten istsvgElement.createSVGPoint(). - Keine Array-Methoden:
map,forEachusw. gibt es nicht direkt. Wandle die Liste mitArray.from()um oder benutze eine Zählschleife. - Leistung: Wenn du sehr viele Punkte auf einmal änderst, ist es meist schneller, das Attribut
pointseinmal als String zu setzen, als tausende einzelneappendItem-Aufrufe zu machen.