D3.js 如何获得';d3中已经创建了什么? cells.append('rect')) .attr('x',函数(d){return d.x;}) .attr('y',函数(d){返回d.y;}) .attr('height',函数(d){return d.dy;}) .attr('fill',函数(d){返回d.children?null:color(d.parent.name);}) cells.append('text') .attr('x',函数(d){返回d.x+d.dx/2}) .attr('y',函数(d){返回d.y+d.dy/2}) .attr('填充','白色') .attr('font-size',14) .文本(功能(d){ if(d.name.lengthrect”)[i].getBBox.width){ 返回d.name; } });

D3.js 如何获得';d3中已经创建了什么? cells.append('rect')) .attr('x',函数(d){return d.x;}) .attr('y',函数(d){返回d.y;}) .attr('height',函数(d){return d.dy;}) .attr('fill',函数(d){返回d.children?null:color(d.parent.name);}) cells.append('text') .attr('x',函数(d){返回d.x+d.dx/2}) .attr('y',函数(d){返回d.y+d.dy/2}) .attr('填充','白色') .attr('font-size',14) .文本(功能(d){ if(d.name.lengthrect”)[i].getBBox.width){ 返回d.name; } });,d3.js,D3.js,我不知道为什么 cells.rect.width 不起作用?但我想知道的是,在将文本附加到形状之前,如何检查形状的宽度 我还尝试将形状的宽度推送到数组中,然后使用索引循环在数组中循环,以检查名称的长度是否大于框的宽度。问题是创建形状时,首先创建面积最大的形状(框)。另一方面,追加文本时,它从右下角到左上角开始 我知道文本的长度和像素是两个不同的单位,但我要用一个简单的比率来转换它。如何获取屏幕上已绘制的矩形的宽度?您可以使用元素(this)及其bbox获取实际宽度。但这不会像您希望的那样工作,因

我不知道为什么

cells.rect.width

不起作用?但我想知道的是,在将文本附加到形状之前,如何检查形状的宽度

我还尝试将形状的宽度推送到数组中,然后使用索引循环在数组中循环,以检查名称的长度是否大于框的宽度。问题是创建形状时,首先创建面积最大的形状(框)。另一方面,追加文本时,它从右下角到左上角开始

我知道文本的长度和像素是两个不同的单位,但我要用一个简单的比率来转换它。如何获取屏幕上已绘制的矩形的宽度?

您可以使用元素(
this
)及其
bbox
获取实际宽度。但这不会像您希望的那样工作,因为您正在比较字符数和像素宽度。要使其工作,您需要先绘制文本,然后检查其宽度与
rect
相比,如果太大,则将其删除

这方面的代码(在绘制了
rect
s和文本之后)如下所示

cells.append('rect')
      .attr('x', function (d) { return d.x; })
      .attr('y', function (d) { return d.y; })
      .attr('height', function (d) { return d.dy; })
      .attr('fill', function (d) { return d.children ? null : color(d.parent.name); })

cells.append('text')
      .attr('x', function (d) { return d.x + d.dx / 2 })
      .attr('y', function (d) { return d.y + d.dy / 2 })
      .attr('fill', 'white')
      .attr('font-size', 14)
      .text(function (d) {
         if (d.name.length < cells.rect.width) {
              return d.name;
         }
       });
单元格。选择全部(“文本”)
.文本(功能(d,i){
if(this.getBBox().width<
document.querySelectorAll(“svg>rect”)[i].getBBox.width){
返回d.name;
}
});

rect对象中有一个子属性

cells.selectAll("text")
     .text(function(d, i) {
       if(this.getBBox().width <
               document.querySelectorAll("svg > rect")[i].getBBox.width) {
         return d.name;
       }
     });

可能会起作用。

啊,这个解决方案不起作用。但我应该更清楚地说明这个问题。我知道文本的长度和像素是两个不同的单位,但是我要用一个简单的比率来转换它。如果我已经在屏幕上有了.rect,我如何获取宽度?提前感谢您在
if
语句中使用类似于第二个术语的内容。确切的选择器(“svg>rect”)取决于svg的结构。
cells.rect.attributes.width.value