SVGコンテンツを削除または置換するにはどうすればよいですか?


200

svgチャートを含む要素を(D3.jsを使用して)作成するJavaScriptコードがあります。AJAXを使用してWebサービスからの新しいデータに基づいてグラフを更新したいのですが、問題は、更新ボタンをクリックするたびに新しいが生成さ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();
2012年

1
使用できますd3.select("svg").empty();
csandreas1 2018年

回答:


282

これが解決策です:

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

これは、removeD3.jsが提供する関数です。


110
実際にsvg から要素を削除したい場合は、次のように使用するのがよいでしょうsvg.selectAll("*").remove();。これにより、svg変数をグループ化要素(g)に設定した場合でも、要素の内容が明確になります。
Nux 2014年

4
@Nux今日は時間通りに出発します。d3.html( '')はSafariでは機能しません。
グリフ2014

ありがとう、ただし、グラフを削除してすぐに新しいグラフを追加しようとすると、追加されませんか?ご提案、ありがとうございます。
–codingbbq

上記のコードは、チャートを含むsvg要素全体を削除します。新しいsvg要素を作成して、新しいグラフを追加する必要があると思います。
2015

Safariバグがまだ存在しているのは奇妙です。彼らはパッチを当てるべきだ。
Tyguy7 2015

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要素をめちゃくちゃにすることを回避できます。これに賛成投票してください。
クエストモンガー2014年

私は過去にこれを使用しましたが、これは正確な解決策です。IDを追加すると、ノードも文書化されます。
Christophe Roussy、2015

31

2つのチャートがありました。

<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を削除するためにこのコードを使用しましたが、SVG内の線形グラデーションはIEに含まれていませんでした

$( "#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でこのジョブに優れたツールを既に使用している場合、DOM操作にjQueryを使用するのは良い考えではありません。特にjQueryを使用していない場合は特にそうです。
Warren Reilly

4

xhtmlを使用している場合、D3が正しい「名前空間」で要素を作成するためでappend("svg:svg")はなくappend("svg")、を使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.