如果你想减少选择到选择的要素的子集,使用过滤。如果要选择后代元素,请使用选择或selectAll。
通常,过滤器用于根据数据或索引过滤元素。但是,您可以在过滤器功能中以this
的身份访问所选元素。因此,如果你有选择的某些元素,并且要减少选择只与1不透明这些元素,你可以说:
var opaque = selection.filter(function() {
return this.style.opacity == 1;
});
为了安全起见,你可能更喜欢看computed style而比元素的样式属性。这样,如果不透明度是从样式表继承的,您将获得正确的值;否则,当一个样式被继承时this.style.opacity
将是空字符串。
var opaque = selection.filter(function() {
return window.getComputedStyle(this, null).getPropertyValue("opacity") == 1;
});
或等价,选择节点并使用selection.style:
var opaque = selection.filter(function() {
return d3.select(this).style("opacity") == 1;
});
你可能会更容易,如果你通过数据或类过滤器,而不是通过计算样式属性。
var opaque = selection.filter(".opaque");
这使得完整意义上的过滤器(和你最后的代码片断几乎正是我结束了在我的代码:例如,如果您设置的节点上的一类,你可以通过类而不是过滤选择)。但我不太清楚select和selectAll都带有函数参数。如何使用函数来选择后代元素?再次感谢。 – 2012-04-11 05:25:30
如果您不想使用选择器字符串(如“.foo”),则只能将select或selectAll与函数一起使用。例如,您可以说'selection.select(function(){return this.firstChild;})'选择每个选定节点的第一个子节点。 – mbostock 2012-04-11 15:49:57