Como posso remover ou substituir o conteúdo SVG?


200

Eu tenho um pedaço de código JavaScript que cria (usando D3.js) um svgelemento que contém um gráfico. Quero atualizar o gráfico com base em novos dados provenientes de um serviço da Web usando AJAX, o problema é que cada vez que clico no botão de atualização, ele gera um novo svg, por isso quero remover o antigo ou atualizar seu conteúdo.

Aqui está um trecho da função JavaScript onde eu crio o svg:

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

Como posso remover o svgelemento antigo ou pelo menos substituir seu conteúdo?



1
@ Felix Kling Obrigado :) a função remove do D3.js resolveu var svg1 = d3.select ("svg") .remove ();
Sami

1
você pode usard3.select("svg").empty();
csandreas1

Respostas:


282

Aqui está a solução:

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

Esta é uma removefunção fornecida pelo D3.js.


110
na verdade, se você quiser remover elementos de SVG que seria melhor usar: svg.selectAll("*").remove();. Isso limpa o conteúdo do elemento, mesmo que seja definido como svgvariável para um elemento de agrupamento ( g).
Nux

4
@ Nux por sua causa, estou saindo a tempo hoje. O d3.html ('') não funciona no Safari.
glif

Obrigado, no entanto, se eu remover um gráfico e imediatamente tentar adicionar um novo gráfico, ele não será adicionado? Qualquer sugestão, obrigado.
Codigobbq

O código acima remove todo o elemento svg que contém o gráfico. você precisaria criar um novo elemento svg para adicionar um novo gráfico, eu acho.
Sami

Estranho que o bug do Safari ainda exista. Eles deveriam consertar isso.
Tyguy7

149

Se você quer se livrar de todas as crianças,

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

irá remover todo o conteúdo associado ao svg.

Nota : Isso é recomendado caso você queira atualizar o gráfico.


9
Eu recomendo isso se você deseja atualizar um gráfico. Remova os filhos e depois acrescente os novos.
Matheus Araujo

Eu usei essa resposta para resolver o meu problema, esta resposta limpar todos os conteúdos criados dentro tag svg, e eu posso atualizar minhas paradas depois de conteúdos de compensação
Hamed R

Isso removerá os ouvintes de eventos associados atribuídos a filhos no SVG?
Anuroop Pendela

58

A configuração do atributo id ao anexar o elemento svg também pode permitir que o d3 selecione, então remova () posteriormente neste elemento por id:

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

...

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

3
Esta é uma solução muito mais segura / limpa do que a selecionada como resposta. selecionando svg usando id, é possível evitar bagunçar outros elementos svg que possam existir na mesma página. por favor, vote este.
Quest Monger

Eu usei isso no passado e esta é uma solução precisa. A adição de um ID também documenta os nós.
Christophe Roussy

31

Eu tinha dois gráficos.

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

Isso removeu todos os gráficos.

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

Isso funcionou para remover o gráfico de barras existente, mas não foi possível adicionar novamente o gráfico de barras depois

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

Tentei isso. Além de permitir a remoção do gráfico de barras existente, também é possível adicionar novamente um novo gráfico de barras.

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 + ')');

Não tenho certeza se essa é a maneira correta de remover e adicione novamente um gráfico no d3. Funcionou no Chrome, mas não foi testado no IE.


6

Estou usando o SVG usando o D3.js. e tive o mesmo problema.

Eu usei esse código para remover o svg anterior, mas o gradiente linear dentro do SVG não estava chegando no IE

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

então eu escrevi o código abaixo para resolver o problema

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

Aqui estou removendo o caminho e o caminho anterior dentro do SVG, substituindo pelo novo.

Mantendo meu gradiente linear dentro das tags SVG no conteúdo estático e depois chamei o código acima, funciona no IE


6

Você também pode usar o jQuery para remover o conteúdo da div que contém o seu svg.

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

12
Não é uma boa idéia usar o jQuery para manipulação do DOM quando você já estiver usando uma ótima ferramenta para este trabalho no D3. Especialmente se você não tiver o jQuery em uso.
22715 Warren Reilly

4

Você deve usar append("svg:svg"), não append("svg")para que o D3 crie o elemento com o 'namespace' correto, se você estiver usando xhtml.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.