以下代码在Chrome,IE11和Opera中呈现正常,但在Firefox的左上角显示文字:
var svgNS = "http://www.w3.org/2000/svg";
var xlinkNS = "http://www.w3.org/1999/xlink";
var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");
svg.setAttributeNS(null, "viewBox", "0 0 1000 1000");
svg.id = "clockSVG";
document.body.appendChild(svg);
var defs = document.createElement('defs');
defs.id = "defs";
svg.appendChild(defs);
var path = document.createElementNS(svgNS,"path");
path.setAttribute("d","M75,20 l100,0 l100,30 q0,100 150,100");
path.setAttribute("id","myTextPath2");
defs.appendChild(path);
var text = document.createElementNS(svgNS,"text");
text.setAttribute("x","10");
text.setAttribute("y","100");
text.setAttribute("fill","black");
svg.appendChild(text);
var textPath = document.createElementNS(svgNS,"textPath");
textPath.setAttributeNS(xlinkNS, "xlink:href", "#myTextPath2");
textPath.textContent = "Text along a more advanced path with lines and curves.";
text.appendChild(textPath);
svg.appendChild(text);
如果我调用text.getBBox(),它会显示它拥抱左侧屏幕边缘并以某种方式接收负y值:
SVGRect { x: 0, y: -14.825797080993652, width: 355.164306640625, height: 18.532245635986328 }
经过一些实验,我发现当在HTML中声明时,要在Firefox中正确呈现textPath元素,textPath元素的内容必须与标记位于同一行。
这将使用奇怪的偏移进行渲染:
<text x="10" y="100" style="stroke: #000000;">
<textPath xlink:href="#myTextPath2">
Text along a more advanced path with lines and curves.
</textPath>
</text>
这将正确呈现:
<text x="10" y="100" style="stroke: #000000;">
<textPath xlink:href="#myTextPath2">Text along a more advanced path with lines and curves.</textPath>
</text>
(如果文本的x和y属性设置为0或留空,则表示正确呈现)
所以我尝试将必要的HTML构建为单行字符串并插入:
var textPathString = '<textPath xlink:href="#myTextPath2">Text along a more advanced path with lines and curves.</textPath>';
text.innerHTML = textPathString;
不幸的是,这不会呈现任何内容(在Chrome中也不起作用)。
如何确保Firefox正确显示JavaScript生成的文本路径?
这些错误是否应该报告?
由于我的项目依赖于能够动态生成文本路径,因此将非常感谢任何和所有帮助!
答案 0 :(得分:0)
您已写过createElement("defs")
而不是createElementNS
,而您已在所有其他方面使用过。{/ p>