【发布时间】:2021-08-05 06:19:36
【问题描述】:
考虑一下这个简单的 SVG,它带有一个 <text> 元素,其中包含一些 <tspan>s:
<svg>
<text x="10" y="30">
Foo Bar Baz
<tspan x="30" dy="30">FooBar</tspan>
<tspan x="30" dy="30">FooBaz</tspan>
</text>
</svg>
现在假设我们想要更改文本本身的 值(在本例中为 “Foo Bar Baz”),同时保留其 <tspan> 后代。如果我们使用textContent、innerHTML(现代浏览器支持innerHTML for SVG)等将替换所有内容,包括儿童:
document.querySelector("text").textContent = "New Foo";
<svg>
<text x="10" y="30">
Foo Bar Baz
<tspan x="30" dy="30">FooBar</tspan>
<tspan x="30" dy="30">FooBaz</tspan>
</text>
</svg>
一种解决方法是获取子节点的第一个 NodeList 元素,通常是文本本身:
document.querySelector("text").childNodes[0].textContent = "New Foo";
<svg>
<text x="10" y="30">
Foo Bar Baz
<tspan x="30" dy="30">FooBar</tspan>
<tspan x="30" dy="30">FooBaz</tspan>
</text>
</svg>
但是,这种解决方法非常麻烦。 “为什么?”,你可能会问......好吧,在集合中使用硬编码索引对我来说已经够难了。另外,就像我上面写的那样,集合中的第一个元素通常是文本本身,但我不知道这是否依赖于实现,因此,新浏览器可以简单地更改该顺序集合,实现不同的序列。
因此正确的方式在我的问题标题中:是否有一个属性或任何其他方法可以专门更改仅在 SVG <text> 元素中的文本内容?
【问题讨论】:
-
您必须更清楚地说明您想要做什么,以避免混淆,从而让人们愿意帮助您发布错误的答案。改进你的问题'你会得到更好的答案。 – SIMBIOSIS 7 分钟前 删除
标签: javascript html svg