javascript - 在 D3 中双击更改节点的颜色

标签 javascript d3.js attributes double-click

我希望节点的颜色在双击时改变。即在第一次双击时,它会变成黑色,但在重新双击它时,它会变回原来的颜色。我可以在第一次双击时让它变黑,但我无法让它变回原来的颜色。在此先感谢,这是我的代码。

var gnodes = svg.selectAll('g.gnode')
                .data(graph.nodes)
                .enter()
                .append('g')
                .classed('gnode', true);

var node = gnodes.append("circle")
                 .attr("class", "node")
                 .attr("r", 5)
                 .style("fill", function(d) {return d.colr; })
                 .on('dblclick', function (d)
                 {
                         if (d3.select(this).style("fill") != "black")
                            {
                                d3.select(this).style("fill", "black");
                            }
                        else
                            {
                                d3.select(this).style("fill", function(d){return d.colr;});
                            }
                })
                .call(force.drag);

最佳答案

您在这里遇到的问题实际上很难发现。

您正在检查 fill 样式是否等于字符串 "black"。问题是,许多浏览器(包括 Chrome 和 FF)将颜色名称重新格式化为 RGB 字符串。因此,当您将填充设置为 "black" 时,它会转换为 RGB 字符串 "rgb(0, 0, 0)"。所以实际上,调用 d3.select(this).style("fill") 将返回此 rgb 字符串而不是颜色名称,确保代码的 else 分支永远不会运行。

您可以通过使用 selection.each 将每个圆的状态存储为 bool 值,然后注册其双击处理程序,从而避免必须将填充的当前状态检查为样式字符串,这切换 bool 值,然后根据其值进行分支。试试这个:

var node = gnodes.append("circle")
  .attr("class", "node")
  .attr("r", 5)
  .style("fill", function(d) {return d.colr; })
  .each(function() {
    var sel = d3.select(this);
    var state = false;
    sel.on('dblclick', function() {
      state = !state;
      if (state) {
        sel.style('fill', 'black');
      } else {
        sel.style('fill', function(d) { return d.colr; });
      }
    });
  });

关于javascript - 在 D3 中双击更改节点的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26049910/

相关文章:

javascript - 克隆并修改 `express-validator`链

javascript - 动态 JavaScript 函数声明

javascript - 自定义 chop 函数删除所有初始文本

javascript - D3 填充日期和值

javascript - 测试一下具有 json 值的图像是否损坏/或不存在并替换为 "no-photo"图像?

javascript - Knockout.JS 自定义绑定(bind)。更新 foreach

javascript - 如何动态更新 d3 中的文本标签?

javascript - 流图 : two questions

Python 装饰器 @func().attribute 语法错误

java - 拦截Java字段和方法访问,创建代理对象