SVG
Børre Stenseth

SVG DOM

Hva

Litt om SVG-dom (Document Object Model). SVG-elementer har en ren XML-struktur. I HTML5 kan vi som illustrert i dette materialet introdusere et svg-element direkte i web-siden. Den blir parset og tolket som svg, med de egenskapene svg-elementer skal ha. Det er imidlertid viktig å være klar over noen forskjeller på svg-noder og vanlige html-noder.

På en vanlig web-side vet vi at vi kan skrive f.eks.:

var dElt=document.getElementById("her");
var echild=document.createElement("p");
echild.appendChild(document.createTextNode("heisann"));
dElt.appendChild(echild);

Vi kan gjøre helt tilsvarende i SVG, f.eks. legge til circle-elementer i et g-element.

var gElt=document.getElementById("der");
var c=document.createElement("circle");
c.setAttribute("cx",80);
c.setAttribute("cy",30);
c.setAttribute("r",20);
gElt.appendChild(c);

Dette gir ikke feil og det ser helt riktig ut når vi inspiserer elementet i browseren. Problemet er at dette ikke har den ønskede effekten i den forstand at vi ikke ser sirkelen på webisden. Elementet vi lager er ikke et funksjonelt svg-element, det er ikke av riktig type. Dersom vi gjør slik fungerer det:

var gElt=document.getElementById("der");
var c = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
c.setAttribute("cx",80);
c.setAttribute("cy",30);
c.setAttribute("r",20);
gElt.appendChild(c);

Dette fungerer også siden det parses dynamisk og parseren i webbrowseren er forberedt på å tolke svg-elementer:

var gElt=document.getElementById("der");
gElt.innerHTML+='<circle cx="80" cy="30" r="20"/>';

Vi lager oss et enkelt eksempel som vi kan bruke til å teste og demonstrere.

_demo

SVG som DOM

Vi prøver å legge til og fjerne sirkler. Strategien for å legge til sirkler er forskjellig for røde og blå.


Røde sirkler legges til med denne koden

_addRed

og fjernes med denne koden

_removeRed

Blå sirkler legges til med denne koden

_addBlue

og fjernes med denne koden (som røde)

_removeBlue

Interaktivitet

Vi bruker det samme eksempelet og forsøker å plante en onclick-funksjon i alle sirklene

Koden er som en kan forvente slik:

_clicking

AJAX

Så langt har vi sett at SVG-elementet føyer seg pent inn i DOMen på webside, untatt når vi skal legge til nye elementer inne i SVG-elementet. Vi skal se litt på hvordan vi kan hente SVG-elementer ved hjelp av AJAX. Vi bruker det samme eksempelet som råmateriale. Vi legger to varaianter på fil

som tekst

Vi bruker en ren tekst fil som ser slik ut:

_demo.svg

Koden:

_getSVGT.js

som xml

Vi bruker en XML-fil som ser slik ut:

_demo.xml

Koden:

_getSVGX.js