如果你想減少選擇到選擇的要素的子集,使用過濾。如果要選擇後代元素,請使用選擇或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