如何在d3.js中选择当前元素的父元素

use*_*097 53 javascript d3.js

我想访问当前元素的父元素

这是HTML的结构

svg
   g id=invisibleG
     g
       circle
     g
       circle
     g
       circle
Run Code Online (Sandbox Code Playgroud)

基本上我想在我将鼠标悬停在圈子上时在圈子中添加文字.

所以我希望在任何特定圈子的悬停上都有这样的东西

svg
       g id=invisibleG
         g
           circle --> radius is increased and text presented inside that
           text
         g
           circle
         g
           circle
Run Code Online (Sandbox Code Playgroud)

在悬停时我可以通过d3.select(this)选择当前元素,如何获得根元素(在我的情况下为g)?

cuc*_*vic 98

您可以使用d3.select(this.parentNode)选择当前元素的父元素.并且为了选择你可以使用的根元素d3.select("#invisibleG").

  • 你也可以做`temp.node().parentNode` (10认同)
  • 您可以执行以下操作:它实际上不会替换"this"但按预期工作.`temp = d3.select("svg"); temp.select(function(){return this.parentNode;})` (6认同)
  • 嘿你是怎么知道的.我是d3.js的新手.任何好书或教程都可能对我有所帮助,请提出建议. (2认同)
  • 非常感谢。我到处都在寻找这个。而且效果很好!是否可以用元素替换“ this”?例如:`temp = d3.select(“ svg”); d3.select(temp.parentNode)`给我错误。 (2认同)

Mol*_*sus 17

要获得根元素g(如cuckovic指出的那样)可以使用:

circle = d3.select("#circle_id"); 
g = circle.select(function() { return this.parentNode; })
Run Code Online (Sandbox Code Playgroud)

这将返回一个d3对象,您可以在其上调用以下函数:

transform = g.attr("transform");
Run Code Online (Sandbox Code Playgroud)

运用

d3.select(this.parentNode)
Run Code Online (Sandbox Code Playgroud)

将只返回SVG元素.下面我测试了不同的变种.

// Variant 1
circle = d3.select("#c1");
g = d3.select(circle.parentNode);
d3.select("#t1").text("Variant 1: " + g);
// This fails:
//transform = d3.transform(g.attr("transform"));

// Variant 2
circle = d3.select("#c1");
g = circle.node().parentNode;
d3.select("#t2").text("Variant 2: " + g);
// This fails:
//transform = d3.transform(g.attr("transform"));


// Variant 3
circle = d3.select("#c1");
g = circle.select(function() {
  return this.parentNode;
});
transform = d3.transform(g.attr("transform"));
d3.select("#t3").text("Variant 3: " + transform);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<html>

<body>
  <svg height="200" width="300">
 <g>
  <circle id="c1" cx="50" cy="50" r="40" fill="green" />
 </g>
<text id="t1" x="0" y="120"></text>
<text id="t2" x="0" y="140"></text>
<text id="t3" x="0" y="160"></text>
</svg>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)