SVG – Learning by Coding
1: <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
2: <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
3: "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4:
5: <!-- hier ggf. externe CSS-Definitionen
6: <?xml-stylesheet href="datei.css" type="text/css"?>
7: -->
8:
9: <!-- SVG - Learning by Coding - http://www.datenverdrahten.de/svglbc/ -->
10: <!-- Author: Dr. Thomas Meinike 12/02 - thomas@handmadecode.de -->
11:
12: <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
13: onload="Init(evt)" onzoom="ZoomControl()">
14:
15: <title>SVG - Learning by Coding</title>
16: <desc>SVG-Spezifikation in Beispielen</desc>
17:
18: <defs>
19:
20: <style type="text/css">
21: <![CDATA[
22: /* interne CSS-Definitionen */
23:
24: .info
25: {
26: fill: #000;
27: font-size: 24px;
28: }
29:
30: a text
31: {
32: fill: #F00;
33: font-size: 12px;
34: }
35:
36: tspan
37: {
38: fill: #000;
39: font-size: 14px;
40: }
41:
42: ]]>
43: </style>
44:
45: <script type="text/javascript">
46: <![CDATA[
47: /* interne Script-Definitionen */
48:
49: // globale Variablen
50: var svgdoc,svgroot,coordsout,timeout,
51: svgns="http://www.w3.org/2000/svg";
52:
53:
54: function Init(load_evt)
55: {
56: svgdoc=load_evt.target.ownerDocument;
57: svgroot=svgdoc.documentElement;
58: svgroot.addEventListener("mousemove",Coords,false);
59: coordsout=svgdoc.getElementById("coordsout");
60: timeout=svgdoc.getElementById("timeout");
61: Uhrzeit();
62: }
63:
64:
65: function getElementsLength(elem)
66: {
67: var obj,objlength;
68: obj=svgdoc.getElementById("rechtecke").getElementsByTagName(elem);
69: objlength=obj.length;
70: alert("Gruppe mit id=\"rechtecke\"\nAnzahl "+elem+"-Elemente: "+objlength);
71: }
72:
73:
74: function ElementInfo(click_evt)
75: {
76: var attr,attrstr="",prevsib="",nextsib="";
77: attr=click_evt.target.attributes;
78: for(i=0;i<attr.length;i++)attrstr+="\n ("+i+") "+attr.item(i).nodeName+" : "+attr.item(i).nodeValue;
79: if(click_evt.target.previousSibling)prevsib=click_evt.target.previousSibling+" -- nodeType: "+click_evt.target.previousSibling.nodeType;
80: else prevsib="nicht vorhanden";
81: if(click_evt.target.nextSibling)nextsib=click_evt.target.nextSibling+" -- nodeType: "+click_evt.target.nextSibling.nodeType;
82: else nextsib="nicht vorhanden";
83: alert("Ereignis: (evt): "+click_evt+" (evt.type): "+click_evt.type+"\n\nAusloeser: (evt.target): "+click_evt.target+"\nTag-Name (evt.target.tagName): "+click_evt.target.tagName+"\n\nEltern-Element (evt.target.parentNode): "+click_evt.target.parentNode+"\nTag-Name (evt.target.parentNode.tagName): "+click_evt.target.parentNode.tagName+"\n\nKind-Knoten (evt.target.childNodes.length): "+click_evt.target.childNodes.length+"\n\nAttribute (evt.target.attributes): "+attr+"\nAnzahl (evt.target.attributes.length): "+attr.length+"\n\n item(i) nodeValue : nodeName"+attrstr+"\n\npreviousSibling: "+prevsib+"\nnextSibling: "+nextsib);
84: }
85:
86:
87: function setCSSProperty(objid,prop,val)
88: {
89: var obj,objstyle,curval;
90: obj=svgdoc.getElementById(objid);
91: objstyle=obj.style;
92: curval=objstyle.getPropertyValue("fill");
93: alert("Aktueller Wert\nfill: "+curval);
94: objstyle.setProperty(prop,val,"");
95: curval=objstyle.getPropertyValue("fill");
96: alert("Neuer Wert\nfill: "+curval);
97: }
98:
99:
100: function setElementsStyle(elem,prop,val)
101: {
102: var obj,objlength,objstyle;
103: obj=svgdoc.getElementById("rechtecke").getElementsByTagName(elem);
104: objlength=obj.length;
105: for(var i=0;i<objlength;i++)
106: {
107: objstyle=obj.item(i).style;
108: objstyle.setProperty(prop,val,"");
109: }
110: }
111:
112:
113: function getAttrById(objid,attr)
114: {
115: var obj,attrval;
116: obj=svgdoc.getElementById(objid);
117: attrval=obj.getAttribute(attr);
118: alert("Attribut: "+attr+"\nWert: "+attrval);
119: }
120:
121:
122: function setAttrById(objid,attr,attrval)
123: {
124: var obj;
125: obj=svgdoc.getElementById(objid);
126: obj.setAttribute(attr,attrval);
127: }
128:
129:
130: function setAttrByTagName(elem,objitem,attr,attrval)
131: {
132: var obj;
133: obj=svgdoc.getElementById("rechtecke").getElementsByTagName(elem);
134: obj.item(objitem).setAttribute(attr,attrval);
135: }
136:
137:
138: function getTextValue(parentid,childelem,node)
139: {
140: var parentobj,childobj,textnode,textval;
141: parentobj=svgdoc.getElementById(parentid);
142: childobj=parentobj.getElementsByTagName(childelem);
143: if(childobj.item(node))
144: {
145: textnode=childobj.item(node).childNodes.item(0);
146: // oder textnode=childobj.item(node).firstChild;
147: textval=textnode.data;
148: alert(textval);
149: }
150: else alert("Textobjekt nicht verfügbar.");
151: }
152:
153:
154: function setTextValue(parentid,childelem,node,textval)
155: {
156: var parentobj,childobj,textnode;
157: parentobj=svgdoc.getElementById(parentid);
158: childobj=parentobj.getElementsByTagName(childelem);
159: if(childobj.item(node))
160: {
161: textnode=childobj.item(node).childNodes.item(0);
162: // oder textnode=childobj.item(node).firstChild;
163: childobj.item(node).style.setProperty("fill","#F90","");
164: textnode.data=textval;
165: }
166: else alert("Textobjekt nicht verfügbar.");
167: }
168:
169:
170: function getTextLength(parentid,childelem,node)
171: {
172: var parentobj,childobj,textlength;
173: parentobj=svgdoc.getElementById(parentid);
174: childobj=parentobj.getElementsByTagName(childelem);
175: if(childobj.item(node))
176: {
177: textlength=childobj.item(node).getComputedTextLength();
178: alert("Textlänge: "+textlength+" Pixel");
179: }
180: else alert("Textobjekt nicht verfügbar.");
181: }
182:
183:
184: function setHover(overout_evt,flag)
185: {
186: var obj,objstyle,fillcol,textdecor;
187: obj=overout_evt.target;
188: objstyle=obj.style;
189: if(flag==1)
190: {
191: fillcol="#00C";
192: textdecor="underline";
193: }
194: else if(flag==0)
195: {
196: fillcol="#F00";
197: textdecor="none";
198: }
199: objstyle.setProperty("fill",fillcol,"");
200: objstyle.setProperty("text-decoration",textdecor,"");
201: }
202:
203:
204: function newElement(elem,attr1,attr2,attr3,attr4,attr5,attr6)
205: {
206: var newobj;
207: newobj=svgdoc.createElementNS(svgns,elem);
208: newobj.setAttribute("x1",attr1);
209: newobj.setAttribute("y1",attr2);
210: newobj.setAttribute("x2",attr3);
211: newobj.setAttribute("y2",attr4);
212: newobj.setAttribute("style","fill:"+attr5+";stroke:"+attr5+";stroke-width:"+attr6);
213: newobj.setAttribute("onclick","ElementInfo(evt)");
214: svgroot.appendChild(newobj);
215: }
216:
217:
218: function newTextNode(objid,elem,attr1,attr2,textval)
219: {
220: var parentobj,newobj,newtextnode;
221: parentobj=svgdoc.getElementById(objid);
222: newobj=svgdoc.createElementNS(svgns,elem);
223: newobj.setAttribute("x",attr1);
224: newobj.setAttribute("dy",attr2);
225: newtextnode=svgdoc.createTextNode(textval);
226: parentobj.appendChild(newobj).appendChild(newtextnode);
227: }
228:
229:
230: function ShowTooltip(e,txt)
231: {
232: var ttrelem,ttrelem,posx,posy,curtrans,ctx,cty;
233: ttrelem=svgdoc.getElementById("ttr");
234: tttelem=svgdoc.getElementById("ttt");
235: tttelem.childNodes.item(0).data=txt;
236: posx=e.clientX;
237: posy=e.clientY;
238: curtrans=svgroot.currentTranslate;
239: ctx=curtrans.x;
240: cty=curtrans.y;
241: ttrelem.setAttribute("x",posx-ctx);
242: ttrelem.setAttribute("y",posy-cty-20);
243: tttelem.setAttribute("x",posx-ctx+5);
244: tttelem.setAttribute("y",posy-cty-8);
245: ttrelem.setAttribute("width",tttelem.getComputedTextLength());
246: tttelem.setAttribute("style","fill: #0000CC; font-size: 11px; visibility: visible");
247: ttrelem.setAttribute("style","fill: #FFFFCC; stroke: #000000; stroke-width: 0.5px; visibility: visible");
248: }
249:
250:
251: function HideTooltip()
252: {
253: var ttrelem,ttrelem;
254: ttrelem=svgdoc.getElementById("ttr");
255: tttelem=svgdoc.getElementById("ttt");
256: ttrelem.setAttribute("style","visibility: hidden");
257: tttelem.setAttribute("style","visibility: hidden");
258: }
259:
260:
261: function ZoomControl()
262: {
263: var curzoom;
264: curzoom=svgroot.currentScale;
265: svgdoc.getElementById("tooltip").setAttribute("transform","scale("+1/curzoom+")");
266: }
267:
268:
269: function Coords(mousemove_event)
270: {
271: var x,y;
272: x=mousemove_event.clientX;
273: y=mousemove_event.clientY;
274: coordsout.firstChild.nodeValue="x: "+x+" | y: "+y;
275: }
276:
277:
278: function ShowHideCoords()
279: {
280: if(coordsout.style.getPropertyValue("visibility")=="visible")
281: coordsout.style.setProperty("visibility","hidden","");
282: else coordsout.style.setProperty("visibility","visible","");
283: }
284:
285:
286: function Uhrzeit()
287: {
288: var datumzeit,temp,zeit;
289: datumzeit=new Date().toLocaleString();
290: temp=datumzeit.lastIndexOf(" ");
291: zeit=datumzeit.substring(temp+1,datumzeit.length);
292: timeout.firstChild.nodeValue=zeit;
293: setTimeout("Uhrzeit()",1000);
294: }
295:
296:
297: function RemoveTspanElement()
298: {
299: var objtext,objtspan,tspanlength;
300: objtext=svgdoc.getElementById("textblock");
301: objtspan=objtext.getElementsByTagName("tspan");
302: tspanlength=objtspan.length;
303: if(tspanlength>0)objtext.removeChild(objtspan.item(tspanlength-1));
304: else alert("Kein tspan-Element zum\nEntfernen verfügbar.");
305: }
306:
307: ]]>
308:
309: </script>
310:
311: <!-- hier ggf. externe Script-Definitionen
312: <script xlink:href="datei.js" type="text/javascript"/>
313: -->
314:
315: <!-- hier ggf. weitere SVG-Definitionen -->
316:
317: </defs>
318:
319: <rect x="35" y="10" rx="5" width="470" height="450" style="fill: #FFF; stroke: #9CF; stroke-width: 2px"/>
320: <text class="info" x="50" y="40">SVG-DOM-Scripting kompakt</text>
321:
322: <g id="rechtecke">
323: <rect x="60" y="90" width="100" height="50" style="fill: #F00" onclick="ElementInfo(evt)"/><rect x="205" y="80" width="60" height="130" style="fill: #090" onclick="ElementInfo(evt)"/><rect x="110" y="160" width="80" height="80" style="fill: #00C" transform="rotate(45,110,160)" onclick="ElementInfo(evt)"/>
324: </g>
325:
326: <circle id="kreis" cx="390" cy="120" r="50" stroke="#00C" style="fill: #FF0" onmouseup="ElementInfo(evt)"/>
327:
328: <text id="textblock" x="0" y="200" onclick="ElementInfo(evt)">
329: <tspan x="310" dy="20">Das ist der erste Testtext.</tspan>
330: <tspan x="310" dy="20">Das ist der zweite Testtext.</tspan>
331: <tspan x="310" dy="20">Das ist der dritte Testtext.</tspan>
332: </text>
333:
334: <g style="font-size: 12px">
335: <text id="coordsout" x="180" y="320" style="fill: #00C; visibility: hidden" onclick="ElementInfo(evt)"> </text>
336: <text id="timeout" x="445" y="35" style="fill: #00C" onclick="ElementInfo(evt)"> </text>
337: </g>
338:
339: <a xlink:href="" cursor="pointer" onclick="return false"><text x="50" y="320" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="ShowHideCoords()">Koordinaten (an/aus): </text></a>
340: <a xlink:href="http://www.datenverdrahten.de/svglbc/" target="_top"><text x="350" y="320" onmouseover="setHover(evt,1);ShowTooltip(evt,'SVG - Learning by Coding')" onmouseout="setHover(evt,0);HideTooltip()">Link mit Tooltip-Anzeige</text></a>
341:
342: <a xlink:href="" cursor="pointer" onclick="return false"><text x="50" y="350" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="getElementsLength('rect')">Anzahl Rechtecke</text></a>
343: <a xlink:href="" cursor="pointer" onclick="return false"><text x="180" y="350" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="setCSSProperty('kreis','fill','#F00')">neue Kreis-Farbe (rot)</text></a>
344: <a xlink:href="" cursor="pointer" onclick="return false"><text x="350" y="350" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="setElementsStyle('rect','fill-opacity',0.4)">Rechtecke: fill-opacity: 0.4</text></a>
345:
346: <a xlink:href="" cursor="pointer" onclick="return false"><text x="50" y="380" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="getAttrById('kreis','r')">Radius des Kreises</text></a>
347: <a xlink:href="" cursor="pointer" onclick="return false"><text x="180" y="380" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="setAttrById('kreis','r','70')">neuer Kreis-Radius</text></a>
348: <a xlink:href="" cursor="pointer" onclick="return false"><text x="350" y="380" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="setAttrByTagName('rect',1,'height','200')">neue Rechteck-Höhe</text></a>
349:
350: <a xlink:href="" cursor="pointer" onclick="return false"><text x="50" y="410" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="getTextValue('textblock','tspan',1)">Wert von Testtext 2</text></a>
351: <a xlink:href="" cursor="pointer" onclick="return false"><text x="180" y="410" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="setTextValue('textblock','tspan',1,'Ein anderer Text.')">Testtext 2 ersetzen</text></a>
352: <a xlink:href="" cursor="pointer" onclick="return false"><text x="350" y="410" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="getTextLength('textblock','tspan',1)">Länge von Texttext 2</text></a>
353:
354: <a xlink:href="" cursor="pointer" onclick="return false"><text x="50" y="440" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="newElement('line','50','295','490','295','#CCC','2px')">neues Element (line)</text></a>
355: <a xlink:href="" cursor="pointer" onclick="return false"><text x="180" y="440" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="newTextNode('textblock','tspan','310','20','Das ist ein weiterer Testtext.')">neues tspan mit Textknoten</text></a>
356: <a xlink:href="" cursor="pointer" onclick="return false"><text x="350" y="440" onmouseover="setHover(evt,1)" onmouseout="setHover(evt,0)" onclick="RemoveTspanElement()">tspan-Elemente entfernen</text></a>
357:
358: <g id="tooltip"><!-- Tooltip - Beginn (ttr=Tooltip-Rechteck, ttt=Tooltip-Text) -->
359: <rect id="ttr" x="0" y="0" rx="5" ry="5" width="100" height="16" style="visibility: hidden"/>
360: <text id="ttt" x="0" y="0" style="visibility: hidden">dyn. Text</text>
361: </g><!-- Tooltip - Ende -->
362:
363: <!-- hier ggf. weitere Grafik-Inhalte -->
364:
365: </svg>
[zum Anfang]