Як я можу видалити або замінити вміст SVG?


200

У мене є фрагмент коду JavaScript, який створює (використовуючи D3.js) svgелемент, який містить діаграму. Я хочу оновити графік на основі нових даних, що надходять від веб-сервісу за допомогою AJAX, проблема полягає в тому, що кожного разу, коли я натискаю кнопку оновлення, вона генерує нову svg, тому я хочу видалити стару або оновити її вміст.

Ось фрагмент функції JavaScript, де я створюю svg:

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

Як я можу видалити старий svgелемент або принаймні замінити його вміст?



1
@ Felix Kling Спасибі :) функція видалення з D3.js вирішила її var svg1 = d3.select ("svg") .remove ();
Самі

1
ви можете використовуватиd3.select("svg").empty();
csandreas1

Відповіді:


282

Ось таке рішення:

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

Це removeфункція, яку надає D3.js.


110
на самому справі , якщо ви хочете , щоб видалити елементи з SVG , було б краще використовувати: svg.selectAll("*").remove();. Це чіткий вміст елемента, навіть якщо встановлена svgзмінна елементу групування ( g).
Nux

4
@Nux через те, що я сьогодні залишаю час. d3.html ('') не працює в Safari.
гліф

Дякую, однак, якщо я видалю діаграму, а потім негайно спробую додати нову діаграму, вона не додається? Будь-яка пропозиція, дякую.
codingbbq

Код вище видаляє весь елемент svg, який містить діаграму. вам потрібно створити новий елемент SVG, щоб додати новий графік, я думаю.
Самі

Дивно, що помилка Safari все ще існує. Вони повинні це зафіксувати.
Tyguy7

149

Якщо ви хочете позбутися всіх дітей,

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

видалить увесь вміст, пов’язаний із svg.

Примітка . Це рекомендується, якщо ви хочете оновити діаграму.


9
Я рекомендую це, якщо ви хочете оновити графік. Видаліть своїх дітей, потім додайте нових.
Матей Арауджо

Я використав цю відповідь, щоб вирішити свою проблему. Ця відповідь очистить увесь створений вміст у тезі svg, і я можу оновити свої діаграми після очищення вмісту
Hamed R

Чи це видалить усіх пов’язаних слухачів подій, призначених дітям у SVG?
Anuroop Pendela

58

Встановлення атрибута id при додаванні елемента SVG може також дозволити d3 вибирати так видалити () пізніше цього елемента за допомогою id:

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

...

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

3
це набагато безпечніше / чистіше рішення, ніж рішення, обране як відповідь. вибравши svg за допомогою id, можна уникнути псування інших елементів SVG, які можуть існувати на одній сторінці. будь ласка, підкресліть це.
Квест Монгер

Я раніше це використовував, і це точне рішення. Додавання ідентифікатора також документує вузли.
Крістоф Руссі

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

Я використовую SVG за допомогою D3.js, і у мене була та сама проблема.

Я використовував цей код для видалення попереднього svg, але лінійний градієнт всередині SVG не надходив у IE

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

тоді я написав код нижче, щоб вирішити проблему

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

тут я видаляю попередній g і шлях всередині SVG, замінюючи новим.

Зберігаючи мій лінійний градієнт всередині тегів SVG в статичному вмісті, а потім я назвав вищевказаний код, Це працює в IE


6

Ви також можете просто використовувати jQuery, щоб видалити вміст div, який містить ваш svg.

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

12
Не чудова ідея використовувати jQuery для маніпуляцій з DOM, коли ви вже використовуєте чудовий інструмент для цієї роботи в D3. Особливо, якщо у вас інакше jQuery не використовується.
Warren Reilly

4

Ви повинні використовувати append("svg:svg"), не append("svg")так, щоб D3 створював елемент з правильним "простором імен", якщо ви використовуєте xhtml.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.