如何删除或替换SVG内容?

Sam*_*ami 190 javascript ajax svg d3.js

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

这是JavaScript函数的一个片段,我在其中创建svg:

var svg = d3.select("body")
        .append("svg")
        .attr("width", w)
        .attr("height", h);
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*ami 267

这是解决方案:

d3.select("svg").remove();
Run Code Online (Sandbox Code Playgroud)

这是removeD3.js提供的功能.

  • 实际上,如果你想删除元素__from__ svg,最好使用:`svg.selectAll("*").remove();`.即使将`svg`变量设置为分组元素(`g`),该元素的明确内容也是如此. (102认同)
  • @Nux因为你我今天准时出发了.d3.html('')在Safari中不起作用. (4认同)

bur*_*rce 141

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

svg.selectAll("*").remove();
Run Code Online (Sandbox Code Playgroud)

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

注意:如果您想要更新图表,建议使用此选项.

  • 如果您想更新图表,我建议您这样做.删除他们的孩子然后追加新的孩子. (8认同)
  • 这会删除分配给 SVG 中子项的任何关联事件侦听器吗? (2认同)

小智 57

在附加svg元素时设置id属性也可以让d3选择,以便稍后通过id在这个元素上删除():

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

...

d3.select("#the_SVG_ID").remove();
Run Code Online (Sandbox Code Playgroud)

  • 这是一个比选择答案更安全/更清洁的解决方案.通过使用id选择svg,可以避免弄乱可能存在于同一页面上的其他svg元素.请upvote这个. (3认同)

小智 29

我有两个图表.

<div id="barChart"></div>
<div id="bubbleChart"></div>
Run Code Online (Sandbox Code Playgroud)

这删除了所有图表.

d3.select("svg").remove(); 
Run Code Online (Sandbox Code Playgroud)

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

d3.select("#barChart").remove();
Run Code Online (Sandbox Code Playgroud)

试过这个.它不仅让我删除现有的条形图,还让我重新添加一个新的条形图.

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 + ')');
Run Code Online (Sandbox Code Playgroud)

不确定这是否是正确的删除方法,并在d3中重新添加图表.它在Chrome中有效,但尚未在IE中测试过.


cju*_*gel 6

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

$("#container_div_id").html("");
Run Code Online (Sandbox Code Playgroud)

  • 当您在D3中使用一个很棒的工具来完成这项工作时,使用jQuery进行DOM操作并不是一个好主意.特别是如果你没有使用jQuery. (12认同)

小智 6

我使用D3.js使用SVG,我有同样的问题.

我使用此代码删除以前的svg但SVG内部的线性渐变没有进入IE

$( "#container_div_id")HTML( "").

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

$('container_div_id g').remove();
$('#container_div_id path').remove();
Run Code Online (Sandbox Code Playgroud)

在这里我将删除SVG中的前一个g和路径,替换为新的.

将我的线性渐变保持在静态内容中的SVG标记内,然后我调用上面的代码,这适用于IE