用D3附加到SVG的元素未出现

mar*_*shp 4 javascript svg d3.js

我正在尝试使用D3显示一些简单的条形图,其中每个条形均为div,但什么都没有显示。

var chartData =  [4, 8, 15, 16, 23, 42];
var body = d3.select('body');
    	
var svg = body.append('svg')
   .attr("width",800)
   .attr("height",500);
    				
var div = svg.append('div').attr('class', '.chart');
    	
for (var i = 0; i < chartData.length; i++) {
   div.append('div')
    	.attr("height", 20)
    	.attr("width", chartData[i]*10)
    	.html(chartData[i]);
}
Run Code Online (Sandbox Code Playgroud)
.chart div {
	font: 10px sans-serif;
  background-color: steelblue;
	text-align: right;
	padding: 3px;
  margin: 1px;
	color: white;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

使用检查SVG时,我看到了新创建的元素,并且svg被突出显示,但是内部div的svg未突出显示。

Ger*_*ado 6

简而言之:您无法将HTML元素附加到SVG。原因很简单:<div><p><h1><h2><td><li>等不是有效的SVG元素。

这已经被问过很多遍了。但是,由于它的特定部分(通常不问),我想回答这个问题:

使用chrome的inspect时,我会看到新创建的元素。

是的,元素在那里。但这并不意味着它将起作用。

让我们在下面的代码片段中展示它,其中我将<div>s 附加到SVG上。看一下console.log,它显示了SVG结构:

var svg = d3.select("svg");

var data = d3.range(5);

var divs = svg.selectAll("foo")
	.data(data)
	.enter()
	.append("div")
	.html("Where are you?")
	
var mySVG = (new XMLSerializer()).serializeToString(svg.node());
console.log(mySVG)
Run Code Online (Sandbox Code Playgroud)
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>
Run Code Online (Sandbox Code Playgroud)

您可以看到div位于DOM中。但是,屏幕上没有任何内容...

您看到DOM中的元素的事实没有任何意义,因为您可以添加任何内容

例如,让我们附加一个名为的元素CharlesDarwin

var svg = d3.select("svg");

var data = d3.range(5);

var divs = svg.selectAll("foo")
	.data(data)
	.enter()
	.append("CharlesDarwin")
	.html("I'm a strange tag!")
	
var mySVG = (new XMLSerializer()).serializeToString(svg.node());
console.log(mySVG)
Run Code Online (Sandbox Code Playgroud)
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>
Run Code Online (Sandbox Code Playgroud)

您可以<charlesDarwin>在DOM中看到。但是,很明显,SVG中不会显示任何内容。

PS:关于您的图表:

  1. 摆脱循环。使用D3时不需要。
  2. 设置没有点的类;
  3. 如上所述,将div附加到主体。

这是工作代码:

var chartData = [4, 8, 15, 16, 23, 42];

var body = d3.select('body');

var div = body.selectAll("foo")
  .data(chartData)
  .enter()
  .append('div')
  .attr('class', 'chart')
  .style("width", d => d * 10 + "px")
  .html(d => d);
Run Code Online (Sandbox Code Playgroud)
.chart {
  font: 10px sans-serif;
  background-color: steelblue;
  text-align: right;
  padding: 3px;
  margin: 1px;
  color: white;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://d3js.org/d3.v4.min.js"></script>
Run Code Online (Sandbox Code Playgroud)