228 votes

Comment supprimer ou remplacer un contenu SVG ?

J'ai un morceau de code JavaScript qui crée (en utilisant D3.js) une svg qui contient un graphique. Je veux mettre à jour le graphique sur la base de nouvelles données provenant d'un service web en utilisant AJAX. Le problème est que chaque fois que je clique sur le bouton de mise à jour, cela génère un nouveau fichier svg Je veux donc supprimer l'ancien ou mettre à jour son contenu.

Voici un extrait de la fonction JavaScript dans laquelle je crée l'objet svg :

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

Comment puis-je supprimer l'ancien svg ou au moins remplacer son contenu ?

6 votes

1 votes

@ Felix Kling Merci :) la fonction remove de D3.js l'a résolu var svg1 = d3.select("svg") .remove() ;

1 votes

Vous pouvez utiliser d3.select("svg").empty();

314voto

Sam Points 1133

Voici la solution :

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

Il s'agit d'un remove fournie par D3.js.

128 votes

En fait, si vous voulez supprimer des éléments de svg qu'il serait préférable d'utiliser : svg.selectAll("*").remove(); . Cela permet d'effacer le contenu de l'élément même s'il est défini svg à un élément de regroupement ( g ).

6 votes

@Nux grâce à vous je pars à l'heure aujourd'hui. d3.html('') ne fonctionne pas dans Safari.

0 votes

Merci, mais si je supprime un graphique et que j'essaie immédiatement d'en ajouter un nouveau, il n'est pas ajouté ? Toute suggestion, merci.

173voto

guavacat Points 450

Si vous voulez vous débarrasser de tous les enfants,

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

supprimera tout le contenu associé au svg.

10 votes

Je recommande cette méthode si vous voulez mettre à jour un tableau. Supprimez leurs enfants puis ajoutez les nouveaux.

0 votes

J'ai utilisé cette réponse pour résoudre mon problème, cette réponse efface tout le contenu créé dans la balise svg, et je peux mettre à jour mes graphiques après avoir effacé le contenu.

2 votes

Cela supprimera-t-il tous les écouteurs d'événements associés, qui sont assignés aux enfants dans le SVG ?

66voto

Le fait de définir l'attribut id lors de l'ajout de l'élément svg peut également permettre à d3 select so remove() plus tard sur cet élément par id :

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

...

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

4 votes

C'est une solution beaucoup plus sûre et propre que celle choisie comme réponse. en sélectionnant le svg à l'aide de l'id, on peut éviter de perturber les autres éléments svg qui pourraient exister sur la même page. s'il vous plaît, votez en faveur de cette solution.

0 votes

Je l'ai utilisé dans le passé et c'est une solution précise. L'ajout d'un identifiant documente également les nœuds.

38voto

Stirling Points 796

J'avais deux tableaux.

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

Cela a supprimé tous les graphiques.

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

Cela a fonctionné pour supprimer le diagramme à barres existant, mais je n'ai pas pu le réinsérer après l'ajout de l'indicateur.

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

J'ai essayé ça. Elle m'a permis non seulement de supprimer le graphique à barres existant, mais aussi de réinsérer un nouveau graphique à barres.

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

Je ne suis pas sûr que ce soit la bonne façon de supprimer et de réintroduire un graphique dans D3. Cela a fonctionné dans Chrome, mais je n'ai pas testé dans IE.

5voto

cjungel Points 181

Vous pouvez également utiliser jQuery pour supprimer le contenu de la division qui contient votre svg.

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

13 votes

Ce n'est pas une bonne idée d'utiliser jQuery pour la manipulation du DOM alors que vous utilisez déjà un excellent outil pour ce travail, D3. Surtout si vous n'utilisez pas jQuery par ailleurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X