【问题标题】:d3 remove text from svgd3从svg中删除文本
【发布时间】:2016-05-06 03:32:29
【问题描述】:

我有修改路径的 S 命令的滑块。我希望源名称出现在它的路径上;但是如何删除以前创建的文本元素?我试图删除它(见下面的代码),但它不起作用。 dom 只是填充了额外的文本元素,并且路径上的文本随着它们开始相互堆积而变得越来越暗。如图所示,我什至尝试通过 id 检查文本元素,但没有成功。希望您能阐明如何删除文本元素,以便在修改每个 S 命令时只有一个。

我在这里添加了一个小提琴(在代码窗口的最底部附加文本): fiddle...

graph.links.forEach(function (d, i) {
        //console.log(obj[0].text, graph.links[i].source.name, graph.links[i].linkid);

        if (graph.links[i].source.name == obj[0].text) {

            var linkid = graph.links[i].linkid;
            var the_path = $("#" + linkid).attr("d");
            var arr = $("#" + linkid).attr("d").split("S");

            //update S command
            $("#" + linkid).attr("d", arr[0] + " S" + scommand_x2 + "," + scommand_y2 + " " + scommand_x + "," + scommand_y);

            svg.select("#txt_" + linkid).remove();

            svg.selectAll("#" + linkid).data(graph.links).enter()
                .append("text")
                .attr("id", "txt_" + linkid)
                .append("textPath")
                .attr("xlink:href", function (d) {
                    return "#" + linkid;
                })
                .style("font-size", fontSize + "px")
                .attr("startOffset", "50%")
                .text("")
                .text(graph.links[i].source.name);

        }
    });

【问题讨论】:

  • 一个工作示例会很好,我们可以轻松调试。
  • 我所需要的只是如何删除 svg 文本元素,最佳实践是我正在寻找的......我已经在互联网上搜索了解决方案,大多数都是 svg.select("#txt_ " + linkid).remove();但是这不起作用。
  • @Rob,如果您提供一个工作示例,您会更快地获得响应,因为其他人调试具体代码比根据您的代码假设什么不起作用更容易单独的sn-p。有很多地方可以创建简单的工作解决方案:jsfiddle、plnkr、jsbin、codepen 等等。
  • 你显然选择了错误的 this ( svg.select("#idHere).remove();) 应该可以工作。我注意到你有两个追加,第二个是那个文本被附加到所以也许选择第二个?所以 ('#'+linkid) 而不是 ('#txt_'_linkid)
  • 我加了一个小提琴。文字堆积如山。无法删除它们。基本上用户可以修改 S 命令,我将为他们提供包含文本的功能,然后通过可调整的 startOffset 将其移动到更靠近路径的末尾。

标签: javascript d3.js svg


【解决方案1】:

这里有一个解决方案:

https://jsfiddle.net/kx3u23oe/

我做了几件事。首先,您不需要像以前那样将此文本绑定到数据。其次,我将变量移到update 函数之外,所有append

var someText = svg.append("text").append("textPath");

然后我只在update函数中保留了这个:

someText.attr("xlink:href", "#L0")
            .style("font-size", "12px")
            .attr("startOffset", "50%")
            .text("some text");

【讨论】:

  • 最后这与我想出的相似,将附加移动到不同偏移百分比的按钮中,以便我可以移动文本。它并不完美;但我在最后期限。感谢 Gerardo 的努力。
  • 让我们试着改进一下,告诉我什么对你来说是“完美的”。
【解决方案2】:

您可以使用“删除”功能删除文本元素。这是相同的工作代码 sn-p。

var text = d3.select("body")
  .append("text")
  .text("Hello...");

setTimeout(function() {
  text.remove();
}, 800);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

顺便说一句,您的代码中的问题是,您正在迭代每个链接 (graph.links.forEach(function (d, i) {) 并在每次迭代中为所有链接 (.data(graph.links).enter()) 创建一个文本元素。这会创建 n*n 个文本标签;其中 n 是链接数。所以我假设你的代码应该如下。

 svg.select("#txt_" + linkid).remove();
 svg.selectAll("#" + linkid)
    .append("text")
    .attr("id", "txt_" + linkid)
    .append("textPath")
    .attr("xlink:href", function (d) {
        return "#" + linkid;
    })
    .style("font-size", fontSize + "px")
    .attr("startOffset", "50%")
    .text(graph.links[i].source.name);

【讨论】:

  • 没用...我加了一个小提琴。文字堆积如山。无法删除它们。基本上,用户可以修改 S 命令,我将为他们提供包含文本的能力,然后通过可调整的 startOffset 将其移动到更靠近路径的末尾。
猜你喜欢
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多