【问题标题】:Why are programmatically inserted SVG <tspan> elements not drawn, except with d3.js?为什么不绘制以编程方式插入的 SVG <tspan> 元素,除了 d3.js?
【发布时间】:2013-05-18 01:32:42
【问题描述】:

假设我想以编程方式在以下 SVG 的 &lt;text&gt; 元素中插入一个额外的 &lt;tspan&gt;

<svg width="300" height="500">
    <text x="50" y="100">
        <tspan x="50">one</tspan>
        <tspan x="50" dy="20">two</tspan>
        <tspan x="50" dy="20">three</tspan>
    </text>
</svg>

这可以通过纯 JavaScript (.appendChild)、jQuery (.append) 和 d3.js (.append) 来完成。然而,虽然这三种方法都成功插入了元素,但我似乎只能在它被 d3.js 插入时才实际显示

在这个小提琴中查看简化的大小写:http://jsfiddle.net/2NLJY/

我测试过的浏览器的行为是一致的:Firefox、Chrome 和 Safari(所有 OS X 10.8)。

这是怎么回事?

【问题讨论】:

    标签: javascript jquery svg d3.js tspan


    【解决方案1】:

    您不能使用 createElement 创建 SVG 元素。 SVG 元素必须在 SVG 命名空间中创建,因此您需要编写

    document.createElementNS("http://www.w3.org/2000/svg", "tspan");
    

    有一个jquery plugin 向 jquery 添加了允许创建 svg 元素的功能。

    【讨论】:

    • 这是有道理的。解决这个问题实际上让我回到了我试图在这里调查的实际问题:为什么在以编程方式插入&lt;tspan&gt; 元素时(有时)会忽略dy 属性? jsfiddle.net/2NLJY/1 这在 Safari 中甚至与在 Chrome 和 Firefox 中看起来都不一样...
    • @serhalp,这是另一个问题。您应该投票和/或接受上述答案。
    • 虽然有用,但只能部分回答我的问题。如上所述使用 createElementNS 创建元素不会在预期位置显示&lt;tspan&gt;
    • 为什么要更改 setAttribute 调用?他们是正确的。不要将 setAttributeNS 用于 xlink 以外的属性。虽然元素在 SVG 命名空间中,但属性通常不在。
    • 谢谢,就是这样。我想我已经阅读了一些关于 w/r/t 命名空间的内容。还有一件事:知道为什么 Safari 在通过appendChild 插入一个新的&lt;tspan&gt; 元素后会忽略d3 插入的dy 属性吗? jsfiddle.net/2NLJY/5
    猜你喜欢
    • 2023-04-02
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多