5

我想使用StackOverflow 中的这种方法处理 D3.js 中重叠的 SVG 元素。

但是,由于我的代码的性质,我想使用 D3 选择器而不是this将元素重新添加到 DOM。我的问题是:如何使用 D3 选择器来获取相关节点?

这是原始示例的执行方式:

this.parentNode.appendChild(this);

这是我的尝试,失败并显示“Uncaught TypeError: Cannot call method 'appendChild' of undefined”:

var thisNode = d3.select("#" + id);
thisNode.parentNode.appendChild(thisNode);

这个 JSFiddle(改编自原始示例)演示了这个问题:http: //jsfiddle.net/cpcj5/

我的 D3 选择与this原始示例中的选择有何不同?我尝试使用thisNode.node().parentNode.appendChild(thisNode)但也失败了。

4

2 回答 2

7

.parentNode方法适用于 DOM 元素,而不是d3 selection

从 d3 选择中访问 DOM 元素有点棘手,而且通常有更好的方法来实现您想要做的事情。无论如何,如果您选择了单个元素,它将是 d3.selection 第一项中的第一个也是唯一一项 - 即您需要像这样访问它:

var someIdDOMelement = d3.select("#someid")[0][0];

使用此编辑的原始示例:http: //jsfiddle.net/cpcj5/1/

如果你有 id 并且特别想获取 DOM 元素,我会选择getElementById

var someIdDOMElement = document.getElementById("someid")  

查看使用 on 绑定事件的 d3 文档,我们可以看到,在您绑定的函数中,this变量是触发事件的 DOM 元素。因此,在 d3 中处理事件处理时,您可以只使用this从绑定函数中获取 DOM 元素。

但是,查看您的代码,我认为更容易坚持使用原始 javascript 方法重新附加节点的原始实现,然后使用d3.select绑定到的 dom 元素创建 d3 选择this。这就是原始代码的执行方式:http: //jsfiddle.net/cpcj5/3/

如果您因此有任何困难,请发表评论,以便我解决。

于 2013-05-08T01:27:58.163 回答
1

您还可以在 D3 中使用 selection.node():

var thisNode = d3.select("#" + id);
thisNode.node().parentNode.appendChild(thisNode.node());
于 2016-04-18T07:03:47.453 回答