I create a svg
element in javascript and I need to set an attribute which is case sensitive: viewBox
.
The element is created like this: var svgElem = document.createElement('svg');
Problem is when it set that attribute via svgElem.setAttribute("viewBox", "0,0,100,100")
and append to the DOM, the resulting element shows like this:
<svg viewbox="0,0,100,100"></svg>
This doesn't work because the viewBox
is case sensitive, it will not take any effect if the letter B
is lowercase.
IE allows an IFlag parameter just for cases like these, however my target audience is restricted to FireFox and Chrome users, which do not have IFlag for setAttribute
as far as I could find.
Is there a way of making this work without using innerHTML
and no-library javascript?
EDIT: I have also tried using dot notation with no success svg.viewBox = "0,0,100,100"
You need to create an actual svg
element. When you do:
var svg = document.createElement('svg');
what you are actually getting is an HTML element named svg
, not an SVG element. The key here is that SVG is not actually an HTML element at all, it is a foreign document root. To create an SVG element properly, you need to do
var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
Specifically, this creates an XML element, rather than an HTML element. In the basic browser case,
document.createElement('div')
is the same as
document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
This makes a big difference, because in HTML, attribute names are not case-sensitive, whereas in XML, they are. Also, if you were to append that SVG to the DOM, it would behave like a div
since it is an unknown HTML element, rather than a real SVG element. An HTML parser is smart enough to create a foreign root node instead of an unknown HTML element, but your code is programmatic, so it can't do it automatically.
It works fine for me in Chrome and Firefox.
var svgns = "http://www.w3.org/2000/svg";
var svg = document.createElementNS(svgns, "svg");
svg.setAttribute("width", "400");
svg.setAttribute("height", "400");
var circle = document.createElementNS(svgns, "circle");
circle.setAttribute("cx", "300");
circle.setAttribute("cy", "300");
circle.setAttribute("r", "100");
svg.appendChild(circle);
document.getElementById("container").appendChild(svg);
// Now change the viewBox
svg.setAttribute("viewBox", "200 200 200 200");
<div id="container">
</div>
(Note: updated to create the SVG from scratch as per OPs request)
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