ChatGPT解决这个技术问题 Extra ChatGPT

如何删除或替换 SVG 内容?

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

以下是我在其中创建 svg 的 JavaScript 函数的片段:

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

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

@Felix Kling 谢谢 :) D3.js 中的 remove 函数解决了它 var svg1 = d3.select("svg") .remove();
您可以使用 d3.select("svg").empty();
我做了一些没有 d3 的 svg,如果一个元素(在我的例子中是一个路径)被赋予了一个 id “p_1”,那么我可以做 var el = document.querySelector("#p_1"); el.parentElement.removeChild(el);

i
itsjeyd

这是解决方案:

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

这是 D3.js 提供的 remove 函数。


实际上,如果您想从 svg 中删除元素,最好使用:svg.selectAll("*").remove();。即使将 svg 变量设置为分组元素 (g),也会清除元素的内容。
@Nux 因为你我今天准时离开。 d3.html('') 在 Safari 中不起作用。
谢谢,但是如果我删除图表然后立即尝试添加新图表,它不会被添加?任何建议,谢谢。
上面的代码删除了包含图表的整个 svg 元素。我猜你需要创建一个新的 svg 元素来添加一个新图表。
奇怪的是 Safari 的 bug 仍然存在。他们应该修补它。
b
bryce

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

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

将删除与 svg 关联的所有内容。


如果您想更新图表,我建议您这样做。删除他们的孩子,然后附加新的孩子。
我用这个答案解决了我的问题,这个答案清除了svg标签内所有创建的内容,我可以在清除内容后更新我的图表
这会删除分配给 SVG 中的子级的任何关联事件侦听器吗?
佚名

在附加 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();

这是一种比选择作为答案的解决方案更安全/更清洁的解决方案。通过使用 id 选择 svg,可以避免混淆同一页面上可能存在的其他 svg 元素。请对此表示赞同。
我过去使用过它,这是一个精确的解决方案。添加 id 也会记录节点。
S
Stirling

我有两张图表。

<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 中测试。


S
Shailender Singh

我正在使用 D3.js 使用 SVG,我遇到了同样的问题。

我使用此代码删除了以前的 svg,但 SVG 中的线性渐变没有出现在 IE 中

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

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

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

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

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


c
cjungel

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

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

当您已经在 D3 中使用一个很棒的工具来完成这项工作时,使用 jQuery 进行 DOM 操作并不是一个好主意。特别是如果您没有使用 jQuery。
S
Sprintstar

如果您使用的是 xhtml,您应该使用 append("svg:svg") 而不是 append("svg"),以便 D3 使元素具有正确的“命名空间”。


p
pink_demon

我遵循 https://www.d3-graph-gallery.com/graph/line_basic.html 中的代码并获得了以下代码:

svg.append("path")
  .datum(filteredData)
  .attr("fill", "none")
  .attr("stroke", "blue")
  .attr("stroke-width", 1.5)
  .attr("d", d3.line()
    .x(function(k) { return x(k.date) })
    .y(function(k) { return y(k.value) })
   )  

所以对我来说,事实证明我在新线的产生之前就打了这个耳光:

d3.selectAll("path").remove()