我有一个小型应用程序,需要在其中生成弧的textPath标签。我正在通过Raphael绘制弧线,效果很好。但是Raphael不支持textPaths。我们可以通过jQuery将它们添加到svg元素中,但是由于某些原因它们无法呈现。当我静态复制动态生成的代码时,它可以很好地呈现。
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="600" height="600">
<desc>Created with Raphaël</desc><defs></defs>
<a title="This is a test entry">
<path fill="none" stroke="#1e79a0" d="M395.2627944162883,355A110,110,0,0,1,199.5099996593139,344.74103073833805" style="stroke-width: 20px; " stroke-width="20" id="This_is_a_test_entry"></path>
</a>
<text>
<textpath xlink:href="#This_is_a_test_entry">This is a test entry</textpath>
</text>
</svg>
使用上面的代码,您将永远看不到弧的标签。但是,当对以下内容进行硬编码时,它将按预期呈现:
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="600" height="600">
<a title="Bacon">
<path id="Arc" fill="none" stroke="#1e79a0" d="M395.2627944162883,355A110,110,0,0,1,201.13265490709162,348.2208261467985" style="stroke-width: 20;" stroke-width="20">
</path>
</a>
<text>
<textPath xlink:href="#Arc">This is an Arc</textPath>
</text>
</svg>
对于为什么我看不到我的整个svg的任何见解,将不胜感激。
编辑:
我已经对JavaScript进行了更改,我认为它几乎已经存在,但是textPath仍然无法呈现。这是当前的代码,这主要归功于Femi:
function drawRange(start, end, R, range, id, title) {
var color = "hsb(".concat(Math.round(R) / 200, ",", end / 360, ", .75)");
var key_position = key[id];
var svg_bits = document.getElementsByTagName('svg')[0].childNodes;
var svgns = document.createElementNS('http://www.w3.org/2000/svg', "path");
var path;
range.attr({title: title});
range.animate({arc: [start, end, R]}, 900, ">");
//Add an id to the path element that was just drawn. This doesn't seem to help though.
for(var i = 0; i < svg_bits.length; i++) {
if (svg_bits[i].tagName == "a" && svg_bits[i].getAttribute('title') == title){
path = svg_bits[i].childNodes[0];
}
}
path.setAttribute('id', title);
//Add the name to the key, set the color and unhide the element.
$(key_position).html(range.attr("title"));
$(key_position).css('color', Raphael.getRGB(color).hex);
$(key_position).show();
};
function makeSVG(tag, attrs) {
var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
for (var k in attrs)
el.setAttribute(k, attrs[k]);
return el;
};
function addLabel(label) {
var text = makeSVG("text", {});
var title = makeSVG("textPath", {"xlink:href":'#' + label.replace(/\s/g, '_')});
title.appendChild(document.createTextNode(label));
text.appendChild(title);
r.canvas.appendChild(text);
};
我得到了一个0x0的textPath边界框,但没有textPath。
最佳答案
您可能需要删除出现在第一个示例中的xlink
,或添加适当的XML名称空间定义。
编辑:添加textPath
元素时,您可能需要使用正确的元素名称(textPath
,而不是textpath
)。
编辑:适度有趣,因为它是浏览器和jQuery更改路径的组合。要获得正确的结果,请使用以下功能(从jquery's append not working with svg element?的答案中解放出来):
function makeSVG(tag, attrs){
var el= document.createElementNS('http://www.w3.org/2000/svg', tag);
for (var k in attrs)
el.setAttribute(k, attrs[k]);
return el;
}
然后执行以下操作:
var paper = Raphael("notepad", 320, 200);
// do all your other stuff here
...
var text = makeSVG("text", {});
var c = makeSVG("textPath", {"xlink:href":"#Arc"});
c.appendChild(document.createTextNode("This is an Arc"));
text.appendChild(c);
paper.canvas.appendChild(text);
那将为您提供正确的SVG:但是,它仍然无法正确绘制,这很奇怪。