javascript - 当用户单击文本时,如何使用 D3.js 切换 svg 文本元素的值?
问题描述
我刚刚开始学习 D3.js 并编写了一个小程序来测试我计划在更大的程序中实现的一些想法。参考这里的代码,文本的初始值为 0。当用户单击文本时,我试图让值在 1 和 0 之间切换。我在 .on(“click”...) 中编码的内容有问题,因为文本没有更改为 1。我做错了什么?
我找到了更新 .attr 的示例,但我找不到任何关于以我想要的方式切换 .text 的内容。
var txt1 = g.append("text")
.attr("id", "txt1")
.text("0")
.attr("x", 10)
.attr("y", 17)
.attr("font-family", "Arial")
.attr("font-size", "12")
.attr("fill", "black")
.on("click", function(){
if (d3.select(this).text === "0"){
d3.select(this).text("1")
}
else{
d3.select(this).text("0");
}
} )
当我第一次单击文本元素时,我希望看到它变为“1”。
解决方案
要直接获取 SVG 元素的文本内容,您可以使用textContent
或innerHTML
在现代浏览器中使用。例如:
var svg = d3.select("svg")
var txt1 = svg.append("text")
.text("0")
.attr("x", 10)
.attr("y", 20)
.on("click", function() {
console.log(this.textContent)
})
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg></svg>
但是,因为您使用的是D3 selection,而不是 SVG 节点,所以您应该使用text
getter,即text()
. 顺便说一句,text()
内部使用textContent
:
export default function(value) {
return arguments.length
? this.each(value == null
? textRemove : (typeof value === "function"
? textFunction
: textConstant)(value))
: this.node().textContent;
}
最后,你不需要那个if
块。0
要在和之间切换1
,只需执行以下操作:
this.textContent = 1 - (+this.textContent);
您甚至可以删除一元加号,因为无论如何字符串都会转换为数字:
this.textContent = 1 - this.textContent;
这是片段:
var svg = d3.select("svg")
var txt1 = svg.append("text")
.text("0")
.attr("x", 10)
.attr("y", 20)
.on("click", function() {
this.textContent = 1 - (+this.textContent);
})
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg></svg>
推荐阅读
- python - 如何简化代码,是否有必要?
- python-3.x - 在 Tkinter 窗口之外运行 OpenGL 窗口
- php - 有什么更好的方法可以使这种插入物更安全、更安全,不会被注射和操纵
- reactjs - 无法在反应嵌套的 useState 挂钩中读取未定义的属性“状态”
- java - 使用 Spring Boot 作为通用 JAR 和 Gradle 的传递依赖项
- java - 如何从浏览器调用 servlet doPost() 方法
- ruby-on-rails - 如何在 AWS Fargate 上使用 webpack 配置 Rails 5
- javascript - 笑话覆盖没有检测到 node.js 中的某些文件
- gremlin - 如何从本地 gremlin-console 将 graphml 文件加载到 Janusgraph 的远程实例中
- python - 我将如何通过 Python 中的这个断言测试来尝试查找字典中列出的所有视图数量的总和?