如何删除或替换SVG内容?


200

我有一段JavaScript代码,用于创建(使用D3.js)svg包含图表的元素。我想基于来自使用AJAX的Web服务的新数据来更新图表,问题是每次我单击更新按钮时,它都会生成一个新图表svg,因此我想删除旧的图表或更新其内容。

这是我创建的JavaScript函数的片段svg

var svg = d3.select("body")
        .append("svg")
        .attr("width", w)
        .attr("height", h);

如何删除旧svg元素或至少替换其内容?



1
@ Felix Kling谢谢:) D3.js的remove函数解决了它var svg1 = d3.select(“ svg”).remove();
萨米(Sami)

1
您可以使用d3.select("svg").empty();
csandreas1'3

Answers:


282

解决方法如下:

d3.select("svg").remove();

这是removeD3.js提供的功能。


110
实际上,如果您想 svg中删除元素最好使用:svg.selectAll("*").remove();。即使将svg变量设置为分组元素(g),也可以清除元素的内容。
Nux 2014年

4
@Nux因为你,我今天准时离开。d3.html('')在Safari中不起作用。
glyph

谢谢,但是,如果我删除一个图表然后立即尝试添加一个新图表,它不会被添加?任何建议,谢谢。
codingbbq

上面的代码删除了包含图表的整个svg元素。您可能需要创建一个新的svg元素以添加一个新的图表,我猜。
萨米(Sami)2015年

奇怪的是Safari错误仍然存​​在。他们应该对此进行修补。
Tyguy7

149

如果你想摆脱所有的孩子,

svg.selectAll("*").remove();

将删除与svg相关的所有内容。

注意:建议您在要更新图表时使用。


9
如果要更新图表,我建议您这样做。删除他们的孩子,然后追加新的孩子。
Matheus Araujo,2016年

我使用此答案解决了我的问题,此答案清除了svg标记内的所有已创建内容,并且清除了内容后可以更新图表
Hamed R

这将删除在SVG中分配给子级的任何关联事件侦听器吗?
Anuroop Pendela

58

在附加svg元素时设置id属性也可以让d3选择,以便稍后通过id在此元素上使用remove():

var svg = d3.select("theParentElement").append("svg")
.attr("id","the_SVG_ID")
.attr("width",...

...

d3.select("#the_SVG_ID").remove();

3
这是比选择答案更安全/更清洁的解决方案。通过使用id选择svg,可以避免弄乱同一页面上可能存在的其他svg元素。请对此投票。
Quest Monger 2014年

我过去曾用过,这是一个精确的解决方案。添加ID也会记录节点。
Christophe Roussy 2015年

31

我有两个图表。

<div id="barChart"></div>
<div id="bubbleChart"></div>

这删除了所有图表。

d3.select("svg").remove(); 

这可以删除现有的条形图,但是之后我无法重新添加条形图

d3.select("#barChart").remove();

试过这个。它不仅让我删除了现有的条形图,而且让我重新添加了新的条形图。

d3.select("#barChart").select("svg").remove();

var svg = d3.select('#barChart')
       .append('svg')
       .attr('width', width + margins.left + margins.right)
       .attr('height', height + margins.top + margins.bottom)
       .append('g')
       .attr('transform', 'translate(' + margins.left + ',' + margins.top + ')');

不确定这是否是正确的删除方法,然后在d3中重新添加图表。它可以在Chrome中运行,但尚未在IE中进行测试。


6

我正在使用D3.js使用SVG,但遇到了同样的问题。

我使用此代码删除了以前的svg,但是IE中没有SVG内部的线性渐变

$(“#container_div_id”)。html(“”);

然后我写了下面的代码来解决这个问题

$('container_div_id g').remove();
$('#container_div_id path').remove();

在这里,我要删除SVG内部的以前的g和路径,用新的替换。

将线性梯度保留在SVG标签内的静态内容中,然后调用上面的代码,这在IE中有效


6

您也可以只使用jQuery删除包含svg的div的内容。

$("#container_div_id").html("");

12
当您已经在D3中为此工作使用了出色的工具时,将jQuery用于DOM操作并不是一个好主意。尤其是如果您没有使用jQuery。
沃伦·赖利

4

如果使用xhtml append("svg:svg"),则应使用,而不是append("svg")D3使元素具有正确的“命名空间”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.