Werden einem SVG-Diagram Click-Handler zugewiesen, kann dies zu Fehlern und dadurch zu unerwartetem Verhalten führen.
Die Ursache des Fehlers liegt in der Reihenfolge und der Art & Weise, in der das SVG aufgebaut wird. Jeder Teil des SVG wird über den SVGBuilder.java dem SVG hinzugefügt. Auch ein Click-Handler ist ein Teil (part) des SVG, der aber nicht wie die anderen Teile einem Element als Child hinzugefügt wird, sondern dem letzten Element (_current) direkt als onClick-Event zugewiesen wird.
Der SVGBuilder setzt die Variable _current allerdings nach der Erzeugung des Elements zurück, wenn der Teil eine Polyline, ein Polygon, ein Rect oder ein Text war. Bsp:
@Override
public void endText() {
_current = null;
}
Wird ein Click-Handler also direkt nach einem der genannten Teile hinzugefügt, tritt der oben gezeigte Fehler auf.
In mehreren draw(SvgWriter)-Methoden wird über die Liste aller parts des SVG iteriert und diese einzeln vollständig (inklusive Aufruf der "end"-Methoden im SVGBuilder) erzeugt.
Lösungen
Je nach dem für welches Element die Click-Handler beabsichtigt sind, gibt es unterschiedliche Lösungen für das Problem:
- Wenn nicht das vorher erzeugt Element als Ziel des Klicks beabsichtigt ist:
Anstatt des _current -Elements den _parent oder mit _root das SVG selbst als Klick-Ziel wählen.
- Wenn es keinen Grund gibt, weshalb der _current auf null gesetzt wird:
Diese Anweisungen entfernen, so dass beim Aufruf der end-Methoden nichts passiert, wie bei endPath() oder endData() .
- Wenn der Click-Handler eigentlich an ein bestimmtes Element gehängt werden müsste, unabhängig der part-Reihenfolge des SVG:
In diesem Fall sollte das Hinzufügen eines Click-Handlers in den Bauprozess eines SVG Elements integriert werden, anstatt als eigener part des SVG zu gelten. Dafür müsste dann auch das Aufrufen der Erzeugung solcher Elemente angepasst werden.