编程语言
首页 > 编程语言> > javascript-在D3中双击更改节点的颜色

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

作者:互联网

我希望节点的颜色在双击时改变.即,在第一次双击时,它将变为黑色,但是在再次双击时,它将恢复为原始颜色.我可以在第一次双击时将其变为黑色,但是无法使其恢复为原始颜色.在此先感谢,这是我的代码.

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);

解决方法:

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

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

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

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; });
      }
    });
  });

标签:double-click,d3-js,attributes,javascript
来源: https://codeday.me/bug/20191029/1957506.html