如何通过 Class Select 元素并在 D3 中检索其 ID
How to Select Element by Class and Retrieve its ID in D3
考虑这段代码:
d3.selectAll("#treemap rect").on("click", function(){
msa = d3.select(this).attr('id');
console.log(msa);
});
HTML:
<div id="treemap" ...>
<rect class="node" id="cityName" ...>
<rect class="node" id="cityName" ...>
<rect class="node" id="cityName" ...>
...
</div>
此外,这里是创建树图结构的代码:
var node = div.datum(newRoot[0]).selectAll(".node")
.data(treemap.nodes)
.enter().append("rect")
.attr("class", "node")
.attr("id", function(d){
return d.cityname ? d.cityname.replace(/[\W\s]/g,"")+"-"+d.stusps: null;
})...//The rest is inconsequential for this problem.
现在 msa = d3.select(this).attr('class');
returns "node" 这是预期的。然而,该元素上的 ID 是一个城市的名称,上面的 JavaScript 代码 returns 为空,我可以看到该 ID 位于 DOM 中。为什么 .attr() 方法不接受 "id" 和 "class" 以及如何获取 ID?
此外,我可以将另一个库与我的堆栈一起使用,例如 JQuery 来获取 ID,但我想使用 D3 来完成。这可能是我的纯粹主义者 ;)
我看过here,但还是没看出来。有什么想法吗,谢谢?
更新:
一个建议是将 SVG 附加到 div,然后像这样在 SVG 标签下创建树图:
var div = d3.select("#dashboardA").append("div")
.style("position", "relative")
.attr("id", "treemap");
div = div.append("svg")
.style("width", (width + margin.left + margin.right) + "px") //1220px
.style("height", (height + margin.top + margin.bottom) + "px") //558px
.style("margin", "auto")
.style("left", margin.left + "px")
.style("top", margin.top + "px");
结果:
树状图现在不可见或不可访问。此外,我发现的大多数树图示例都创建了没有任何 SVG 标签的树图。这里是官方example。他们都错了吗?
您的标记无效。您不能在 HTML div
中使用 SVG rect
;矩形需要嵌套在 svg 容器中。
接下来,使用此代码:
d3.selectAll("#treemap rect").on("click", function(){
msa = d3.select(this).attr('id');
console.log(msa);
});
你在点击什么?无效的标记不会产生矩形,也不会产生任何可点击的内容。
所以……if you place the rects in an svg
your code works as expected.
考虑这段代码:
d3.selectAll("#treemap rect").on("click", function(){
msa = d3.select(this).attr('id');
console.log(msa);
});
HTML:
<div id="treemap" ...>
<rect class="node" id="cityName" ...>
<rect class="node" id="cityName" ...>
<rect class="node" id="cityName" ...>
...
</div>
此外,这里是创建树图结构的代码:
var node = div.datum(newRoot[0]).selectAll(".node")
.data(treemap.nodes)
.enter().append("rect")
.attr("class", "node")
.attr("id", function(d){
return d.cityname ? d.cityname.replace(/[\W\s]/g,"")+"-"+d.stusps: null;
})...//The rest is inconsequential for this problem.
现在 msa = d3.select(this).attr('class');
returns "node" 这是预期的。然而,该元素上的 ID 是一个城市的名称,上面的 JavaScript 代码 returns 为空,我可以看到该 ID 位于 DOM 中。为什么 .attr() 方法不接受 "id" 和 "class" 以及如何获取 ID?
此外,我可以将另一个库与我的堆栈一起使用,例如 JQuery 来获取 ID,但我想使用 D3 来完成。这可能是我的纯粹主义者 ;)
我看过here,但还是没看出来。有什么想法吗,谢谢?
更新:
一个建议是将 SVG 附加到 div,然后像这样在 SVG 标签下创建树图:
var div = d3.select("#dashboardA").append("div")
.style("position", "relative")
.attr("id", "treemap");
div = div.append("svg")
.style("width", (width + margin.left + margin.right) + "px") //1220px
.style("height", (height + margin.top + margin.bottom) + "px") //558px
.style("margin", "auto")
.style("left", margin.left + "px")
.style("top", margin.top + "px");
结果:
树状图现在不可见或不可访问。此外,我发现的大多数树图示例都创建了没有任何 SVG 标签的树图。这里是官方example。他们都错了吗?
您的标记无效。您不能在 HTML div
中使用 SVG rect
;矩形需要嵌套在 svg 容器中。
接下来,使用此代码:
d3.selectAll("#treemap rect").on("click", function(){
msa = d3.select(this).attr('id');
console.log(msa);
});
你在点击什么?无效的标记不会产生矩形,也不会产生任何可点击的内容。
所以……if you place the rects in an svg
your code works as expected.