javascript - 动态添加按钮d3.js

标签 javascript d3.js

这似乎是一个非常微不足道的问题,但我一生都无法找到令人满意的答案。

如何添加具有绑定(bind)功能的按钮,而不将其硬编码到页面中或对“onclick”属性进行字符串化?

some_div_selection.append("button").text("+").on("click", console.log("You clicked me"));

相反,我见过人们这样做的唯一方法是

some_div_selection.append("button").attr("onclick", "foobar()").text("+")

这看起来非常笨重和脆弱。我需要为按钮提供某种数据吗?

最佳答案

我是一名 D3 程序员,我必须说,这些年来我从未见过任何 D3 代码使用您声称是您见过的唯一方法,即设置 onclick属性:

selection.attr("onclick", "foo()")

它确实有效,但这不是惯用的 D3。在 D3 中,我们使用 on 方法。但是,您的第一个代码片段的问题是它立即调用该函数:

d3.select("body")
  .append("button")
  .html("Click me")
  .on("click", console.log("you clicked me"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

您可以看到控制台显示“you clicked me”,无需任何点击。因此,为了使其正常工作,我们不应该调用该函数。有趣的是,console.log 接受 3 个参数,看看如果我们不调用 console.log 会发生什么:

d3.select("body")
  .append("button")
  .html("Click me")
  .on("click", console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

现在,当您单击按钮时,console.log 即可工作,因为您将其作为函数引用传递。但是,第一个值是 undefined,因为您没有将任何字符串传递给 console.log

话虽这么说,你想要的是:

d3.select("body")
  .append("button")
  .html("Click me")
  .on("click", () => {
    console.log("you clicked me")
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

现在您将一个正确的函数传递给 click 事件,该事件将在您单击时调用。

关于javascript - 动态添加按钮d3.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59078605/

相关文章:

Native 浏览器和 Node.js 中的 JavaScript 函数声明,得到不同的结果

javascript - 多个属性的递归搜索

javascript - 从嵌套数组中下拉选择

javascript - 在传单雄蕊 map 中排除缩放级别

javascript - 生成折线图时出错,未捕获 TypeError : Cannot read property 'each' of undefined

javascript - 带有子值指示器和标签的仪表图

javascript - jQuery Opera 焦点事件不起作用

javascript - 如何更改 d3 Circle Pack 中的过滤器?

javascript - 初始 "jumpy"拖动行为

javascript - D3强制布局应在单击节点时添加节点和链接