Good Day,
I am having incredible difficulty in creating a path and displaying it using "appendChild" within an SVG element.
I have to be missing something critically simple as I have poured over W3C's specs, w3schools.com, various posts here and trying to ninja google in various ways.
I am testing within FireFox and Chrome.
I have a simple svg file thus:
<svg xmlns:svg ... id="fullPageID"> <image id="timer1" x="100" y="100" width="100px" height="100px" xlink:href="../component/timer/timer1.svg" /> <image id="battery1" x="200" y="200" width="100px" height="100px" xlink:href="../component/battery/30x20_ochre.svg" /> <script xlink:href="pathMaker.js" type="text/javascript" id="pathMaker" /> </svg>
The script I am attempting to use looks like:
newpath = document.createElementNS("SVG","path"); newpath.setAttribute("id", "pathIdD"); newpath.setAttribute("d", "M 1,97.857143 C 19.285714,96.428571 24.016862,131.64801 90.714286,132.85714 140.78762,133.7649 202.79376,66.16041 202.79376,66.16041"); newpath.setAttribute("stroke", "black"); newpath.setAttribute("stroke-width", 3); newpath.setAttribute("opacity", 1); newpath.setAttribute("fill", "none"); document.getElementById("fullPageID").appendChild(newpath);
I just want to make something simple work. Am I wrong to think that I don't require a solution as complicated as the one found at Library to generate SVG Path with Javascript??
Thanks Kindly.
Absolutely right. g tag is better. Thanks for the info.
Just the same as you would add a class to an html element, by adding a class attribute. Though to be able to target that with css the svg code must be inserted into the document in-line, it can't be referenced by an <img> tag for example.
The <path> element is the most powerful element in the SVG library of basic shapes. It can be used to create lines, curves, arcs, and more. Paths create complex shapes by combining multiple straight lines or curved lines. Complex shapes composed only of straight lines can be created as <polyline> s.
There are two issues:
As already pointed out, you have to use the full namespace uri, so in this case:
newpath = document.createElementNS('http://www.w3.org/2000/svg',"path");
Attributes also need to be set with namespace in mind. The good news is that you can pass in null
as the namespace uri, so:
newpath.setAttributeNS(null, "d", "M 1,97.857143 C 19.285714,96.428571 24.016862,131.64801 90.714286,132.85714 140.78762,133.7649 202.79376,66.16041 202.79376,66.16041");
Also, here are two ways to make dealing with the svg namespace easier (assuming that it is a standalone svg, not embedded in HTML):
document.rootElement
.document.rootElement.getAttribute(null, "xmlns")
returns an empty string (while requesting other attributes does work using this method. Instead, use document.rootElement.namespaceURI
.So in your code, you could make the following rewrites:
From:
newpath = document.createElementNS("http://www.w3.org/2000/svg","path");
To:
newpath = document.createElementNS(document.rootElement.namespaceURI,"path");
And to append the element, you can go from:
document.getElementById("fullPageID").appendChild(newpath);
to:
document.rootElement.appendChild(newpath);
So the final script would be:
newpath = document.createElementNS(document.rootElement.namespaceURI,"path"); newpath.setAttributeNS(null, "id", "pathIdD"); newpath.setAttributeNS(null, "d", "M 1,97.857143 C 19.285714,96.428571 24.016862,131.64801 90.714286,132.85714 140.78762,133.7649 202.79376,66.16041 202.79376,66.16041"); newpath.setAttributeNS(null, "stroke", "black"); newpath.setAttributeNS(null, "stroke-width", 3); newpath.setAttributeNS(null, "opacity", 1); newpath.setAttributeNS(null, "fill", "none"); document.rootElement.appendChild(newpath);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With