从基准访问 d3.js 元素属性?

Posted

技术标签:

【中文标题】从基准访问 d3.js 元素属性?【英文标题】:Accessing d3.js element attributes from the datum? 【发布时间】:2012-07-05 09:08:08 【问题描述】:

我正在尝试使用 d3.js 的 .data() 函数访问我已经在屏幕上绘制的某些特定 svg 圆圈的 cx 和 cy 属性,有人可以帮忙吗?尝试访问它的代码如下。

d3.selectAll(".mynode").each( function(d, i)
  if(d.someId == targetId)
    console.log( d.attr("cx") );    // just trying to demo my point, doesn't work
  

我对 d3.js 和 javascript 还是很陌生,所以我不确定我是否要从头到尾处理这个问题,或者我可能错过了内置解决方案?

【问题讨论】:

你试过 d.cx 吗?如果您在 d3.selectAll(".mynode") 上调用 .data,并且 data 的参数包含带有 cx 字段的对象,那应该可以。 【参考方案1】:

您的代码试图从数据项中获取 svg 属性,而您真正想要的是从 svg DOM 元素中获取该属性,如下所示:

console.log(d3.selectAll(".mynode").attr("cx"));

这只会给你选择的第一个非空元素的属性;你也可以filter你的选择来获取你正在寻找的DOM元素:

console.log(d3.selectAll(".mynode").filter(_conditions_).attr("cx"));

或者,如果您想访问所有选定元素的属性,请在每个函数中使用 this

d3.selectAll(".mynode").each( function(d, i)
  if(d.someId == targetId)
    console.log( d3.select(this).attr("cx") );
  

【讨论】:

我之前使用的是d3.select(this).attr("cx"),但它返回了null,我最终意识到我正在请求一个svg组元素的cx属性(doh!),我不得不将其修改为d3.select(this.firstChild).attr("cx") 要访问我在 group 元素中的 circle 元素,我不喜欢使用 firstChild/lastChild 等,但它现在可以使用。如果您没有建议,我也不会考虑过滤方法,我仍然不完全确定在搜索特定基准值时如何实现它,但谢谢! 我还要补充一点,如果您尝试在命令链的早期访问它并且尚未设置特定值,它可能会返回 null。【参考方案2】:

还有更简单的方法:(提供索引i

d3.selectAll("circle")[0][i].attributes.cx.value

可以看到here。

【讨论】:

【参考方案3】:

接受的答案中的过滤方法是正确的。接受答案中的第二种方法(使用 .each)是不正确的,并且包含与提问者相同的错误:如果未调用 .data() (这里就是这种情况),则第一个参数 d 传递给 .each将是未定义的(而不是“当前的 dom 节点”,正如所有新手,包括我自己所期望的那样);您通过 d3.select(this) 获得的当前 dom 节点,这在最后的 if 语句中是正确的 - 错误在 if 测试条件中。正确的版本如下。

d3.selectAll(".mynode").each(function(d,i)
    var elt = d3.select(this);
    if (elt.attr("id") == "yourTargetIdGoesHere")
        console.log( elt.attr("cx") );
    
);

fiddle:fiddle(包含两个版本的代码,即过滤器和每个)

更新:我的回答是假设您没有使用 .data(),因为您没有为此提供代码;后来我看到你写道你确实使用了 .data()

在这种情况下,根据您的数据结构,将 d.attr("cx") 替换为普通的 d.cx 可能会起作用。

【讨论】:

【参考方案4】:

这里最简单的是给每个节点一个唯一的 id,然后选择具有目标 id 的节点来运行你的转换。

【讨论】:

以上是关于从基准访问 d3.js 元素属性?的主要内容,如果未能解决你的问题,请参考以下文章

d3.js中attr和style 有啥区别

D3.js入门 select选择器 元素的插入和删除 dataum和data 动态属性

D3.js入门 select选择器 元素的插入和删除 dataum和data 动态属性

D3.js 弧生成器 (V3版本)

有没有办法用 D3.js 修改 Vega 图表?

使用 AngularJs 和 D3.js 从 svg 元素调用自定义函数