我可以为任何节点上的点击事件定义一个内联函数,但我试图让代码更干净,所以我想声明我的函数,并为点击事件调用它。
这是内联版本:
node.on("click", function(n){
var active = !n.active ? true :false;
console.log(active);
})
这是带有函数调用的版本:
node.on("click", linkSwitch(n));
linkSwitch(n){
var active = !n.active ? true :false;
console.log(active);
}
仅适用于函数调用版本。我得到这个错误:
Uncaught ReferenceError: n is not defined
我不知道为什么??
当您执行此操作时。。。
node.on("click", function(n){
参数n
对应于D3自动传递给匿名函数的第一个参数,即数据。
然而,当你这样做时:
node.on("click", linkSwitch(n));
你有两个问题:
- 你的
n
显然是未定义的,所以这个错误没有什么奇怪的,这是意料之中的 - 您不是在点击时调用函数:而是立即调用函数并返回其值
解决方案:应该只是:
node.on("click", linkSwitch)
这里有一个演示:
const data = [{
name: "foo",
active: true
}, {
name: "bar",
active: true
}, {
name: "baz",
active: true
}];
const paragraphs = d3.select("body")
.selectAll(null)
.data(data)
.enter()
.append("p")
.text(d => d.name);
paragraphs.on("click", linkSwitch);
function linkSwitch(n) {
var active = !n.active ? true : false;
console.log(active);
}
<script src="https://d3js.org/d3.v5.min.js"></script>
PS:一些附加问题:
- 函数声明中缺少
function
- 函数中的逻辑可以缩短为
var active = !n.active