d3添加多个具有功能的类

Posted

技术标签:

【中文标题】d3添加多个具有功能的类【英文标题】:d3 add multiple classes with function 【发布时间】:2012-10-22 16:37:25 【问题描述】:

我的 svg 为:

<g class="user" title="Michael" rel="tooltip" transform = "rotate(-12.364052661705784)translate(360)" style="fill: #9467bd; "></g>

我想添加一个与标题相同的类。我试过了

d3.selectAll('.user').attr('class','Michael');

但它取代了原来的类。然后我尝试了

d3.selectAll('.user').classed('Michael',true);

有效!但现在我想用类似的函数返回类名

d3.selectAll('.user').classed(function()return this.attr('title');,true);

它不起作用。我该怎么做?

谢谢

【问题讨论】:

【参考方案1】:

您可以通过简单地用空格分隔它们的名称来为元素分配多个类:

d3.selectAll(".user").attr("class", "user Michael");

但您似乎真正需要的是为您的元素分配一个数据属性,最好使用html5 data- attributes。所以你可以这样做:

d3.selectAll(".user").attr("data-name", function(d,i)  return "Michael #" + i; );

及以后获取用户名:

d3.select(".user").attr("data-name")

【讨论】:

顺便说一句,你也可以用.classed('user Michael', true)分配多个类:github.com/mbostock/d3/wiki/Selections【参考方案2】:

为什么要使用 HTML5 数据属性,复制标题属性中已经存在的数据? HTML5 数据属性固然有用,但复制数据不是一件好事。

这很容易做到,无需重复数据,与您最初的想法很接近。

d3.selectAll('.user').each(
    function()
        var elt = d3.select(this);
        elt.classed(elt.attr("title"), true);
    
) 

【讨论】:

这似乎是一个更好的答案,因为它实际上允许您使用一个函数来设置所要求的类。【参考方案3】:

如果你只是想添加一个类,可以跳出d3,使用类列表:

d3.selectAll('.user').node().classList.add("mynewclass");

可能无法在非常旧的浏览器中运行。

【讨论】:

【参考方案4】:

Ilya 的回答很好,但如果您想留在 d3.select().classed() 框内,从数据中添加类的最佳方法是使用 attr 添加类:

.attr('class', function (d)  return d.class )

但是,这将用那个类替换该类,所以如果你想添加多个类,那么你必须在一行中完成。

.attr('class', function (d)  return d.class + " " + d.otherclass)

这是有限的,因为你不能真正追加类,但我相信它也解决了 OP 的问题。

【讨论】:

以上是关于d3添加多个具有功能的类的主要内容,如果未能解决你的问题,请参考以下文章

使用d3在两个节点之间绘制多个边

C++ 多个具有相同名称的类

Xamarin MVVMCross:注册具有多个接口的类的单例

创建多个具有相同名称的类对象? C++

如何简化具有多个类的游戏循环

如何在 C++ 中运行具有仅调用线程的函数的类的多个对象?