D3:选择并更改外部SVG?

D3:选择并更改外部SVG?,svg,d3.js,graphics,adobe-illustrator,inkscape,Svg,D3.js,Graphics,Adobe Illustrator,Inkscape,是否可以在Adobe Illustrator中创建的嵌入式(外部)SVG中选择和更改元素 html: 但是如何在D3中解析和修改呢? 附加问题:调试D3选择器的最佳方法?这实际上是一个令人讨厌的情况,因为您不能直接在嵌入式文档上使用DOM选择器。原则上,您需要的选择器是“#circles>circle”,但在这种情况下不起作用。所以你需要一些丑陋的东西,比如 var my_circles = d3.select(document.getElementById("circles").content

是否可以在Adobe Illustrator中创建的嵌入式(外部)SVG中选择和更改元素

html:

但是如何在D3中解析和修改呢?
附加问题:调试D3选择器的最佳方法?

这实际上是一个令人讨厌的情况,因为您不能直接在嵌入式文档上使用DOM选择器。原则上,您需要的选择器是
“#circles>circle”
,但在这种情况下不起作用。所以你需要一些丑陋的东西,比如

var my_circles = d3.select(document.getElementById("circles").contentDocument)
                   .selectAll("circle");
我发现Javascript控制台对于调试选择器非常有用。只需输入您想要测试的内容,看看是否返回了您想要的内容

问题是,上述代码仅在加载对象后才起作用。即使使用JQuery的
.ready()
之类的工具也不足以确保这一点。一个快速而肮脏的解决方案是反复检查元素是否存在,直到它们:

function changeColor() {
  var sel = d3.select(document.getElementById("circles").contentDocument)
              .selectAll("circle");
  if(sel.empty()) {
    setTimeout(changeColor, 100);
  } else {
    sel.attr("fill", "black");
  }
}
changeColor();

完整示例。

我尝试了您的代码,但在我的Javascript控制台中仍然得到“0:Array[0]”,我将其解释为返回零元素,对吗?这个数组中不应该有两个“圆”吗?那么中间的“svg”元素呢?您应该能够选择圆,而无需显式指定中间的svg。你能在某个地方发布一个完整的例子吗?我基本上只包含了例子中的内容:用我发布的代码选择圆圈对我来说很好。仅供参考,我发布了一个问题来澄清加载问题--
<script>
  var my_circles = d3.select("#circles svg").selectAll("circles");
  my_circles.attr("fill", "black");
</script>
var svg = document.getElementById('circles');
var my_circles = d3.select(document.getElementById("circles").contentDocument)
                   .selectAll("circle");
function changeColor() {
  var sel = d3.select(document.getElementById("circles").contentDocument)
              .selectAll("circle");
  if(sel.empty()) {
    setTimeout(changeColor, 100);
  } else {
    sel.attr("fill", "black");
  }
}
changeColor();