如果您的元素具有唯一的 CSS 可访问标识符,则可以使用:not()
选择器。一些潜在的例子:
d3.selectAll("circle.prospect:not(#" + this.id + ")");
d3.selectAll("circle.prospect:not(." + someUniqueClassFrom(d) + ")");
d3.selectAll("circle.prospect:not([uniqueAttr=" + this.getAttribute('uniqueAttr') + "])");
原因d3.selectAll('circle.prospect:not(this)')
不起作用是因为它只是字面上说要过滤掉任何<this></this>
元素——这显然不是你的意图,因为它已经只选择了<circle></circle>
元素,无论如何都没有效果。
即使您通常不应用一些独特的 DOM 属性,也没有理由不能暂时设置一个:
vis.selectAll('circle.prospect')
.on("mouseover", function(d) {
this.id = 'temp-' + Math.random();
d3.selectAll('circle.prospect:not(#' + this.id + ')').transition().style('opacity','0.5');
d3.select(this).attr('opacity','1.0');
this.id = '';
});
但是,如果您的元素尚未分配 ID,我认为 Ian Roberts 的解决方案可能是我会做的,而不是这个临时标识符黑客。