javascript - 为点击事件定义和调用函数而不是内联函数
问题描述
我能够为任何节点上的点击事件定义一个内联函数,但是我试图让我的代码更简洁,所以我想声明我的函数并为点击事件调用它。
这是内联版本:
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 自动传递给匿名函数的第一个参数,即datum。
但是,当您这样做时:
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
推荐阅读
- php - 如何更新 Sonata getFlashMessage 和 addStatusService 弃用
- vue.js - Github 页面上 Nuxt 项目的资产未显示
- ruby-on-rails - nginx.conf-passenger_env_var 未加载到 rails
- gson - 使用流 api 将 json 转换为 java POJO
- javascript - 如何使用 JavaScript 定位模板中保存的元素?
- outlook - MAPI 通讯录提供商:联系人卡片弹出
- gradle - 如何在 build.gradle 中设置变量?
- wordpress - WordPress / WooCommerce - 无法获取所有变体数据
- javascript - 批处理/javascript文件从多个文件中删除行尾的逗号
- javascript - 类型错误:this.isModified 不是函数