d3.js - 从函数附加时文本元素不可见
问题描述
我想使用 append() 函数中的函数将文本添加到我的 d3 可视化中。但即使生成的 DOM 与添加静态文本(将文本直接传递给 append())完全相同,它在 svg 画布上也不可见。
var svg = d3.select("body").append("svg");
svg.attr("width", 800);
svg.attr("height", 600);
svg.selectAll("g.m1").data([1, 2, 3])
.enter()
.append("g")
.attr("class", "m1")
.attr("transform", "translate(50,50)")
.append("text")
.attr("dy", function(d) {
return d + ".0em"
})
.text(function(d) {
return "Hello world directly: " + d;
});
svg.selectAll("g.m2").data([1, 2, 3])
.enter()
.append("g")
.attr("class", "m2")
.attr("transform", "translate(50,150)")
.append(function(d) {
var t = d3.create("text");
t.attr("dy", d + ".0em")
.text("Hello world via function: " + d);
return t.node();
});
svg {
border: 3px solid red;
}
text {
fill: black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
在输出中,我只看到“m1”文本中的文本,而不是“m2”文本。甚至输出的 HTML 也完全相同: https ://imgur.com/a/2xusuPD
解决方案
如果您正在创建一个断开连接的 SVG 元素,您必须提供一个命名空间,即 svg:text 而不仅仅是文本。
var svg = d3.select("body").append("svg");
svg.attr("width", 800);
svg.attr("height", 600);
svg.selectAll("g.m1").data([1, 2, 3])
.enter()
.append("g")
.attr("class", "m1")
.attr("transform", "translate(50,50)")
.append("text")
.attr("dy", function(d) {
return d + ".0em"
})
.text(function(d) {
return "Hello world directly: " + d;
});
svg.selectAll("g.m2").data([1, 2, 3])
.enter()
.append("g")
.attr("class", "m2")
.attr("transform", "translate(50,150)")
.append(function(d) {
var t = d3.create("svg:text");
t.attr("dy", d + ".0em")
.text("Hello world via function: " + d);
return t.node();
});
svg {
border: 3px solid red;
}
text {
fill: black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
推荐阅读
- r - 如何在 R 中以 2 y 轴平滑我的线?
- python - 3.8.1 数据/ETL 工作流的生产和沙盒环境
- reactjs - 使用带有道具的构造函数的正确方法?
- go - 为什么在新计算机上访问 Firestore 时出现“恐慌:运行时错误:无效的内存地址或零指针取消引用”?
- javascript - Mongoose 查询最近 24 小时内获得点赞的文档
- javascript - Promise.allSettled 中的 promise 数组的顺序以及创建数据库事务的顺序?
- regex - GREP 正则表达式无法正常工作,但我的正则表达式是正确的
- html - 如何从矩形切入div?
- c++ - Why does cudaMemGetInfo report a change in the total amount of device memory?
- css - 动画期间元素不可见