D3单击事件处理程序

时间:2017-09-12 21:43:23

标签: javascript d3.js event-handling

我正在学习D3并且有一个与交互性有关的问题。

以下示例适用于根据单击的按钮调整屏幕上的一组圆圈的大小。它工作(我正在按照教程)。实际上,CSV文件中的键名绑定到每个按钮,单击该按钮时,将该键名称中继到附加函数(在此示例中名为buttonClick),该函数用于访问每个对象中的键/值对的值。我的数据。然后使用d3.max()函数计算最大值,用于确定新的比例并相应地重绘圆圈。

我的问题是:函数buttonClick如何知道接受绑定到每个按钮的“data”属性作为参数?为什么在onclick事件处理程序中调用函数时没有括号?

感谢您提供的任何帮助。

function createSoccerViz() {

d3.csv("worldcup.csv", data => {overallTeamViz(data)

});

function overallTeamViz(incomingData) {   
d3.select("svg")
.append("g")
.attr("id","teamsG")
.attr("transform", "translate(50,300)")
.selectAll("g").data(incomingData).enter()
.append("g")
.attr("class", "overallG")
.attr("transform", (d,i) => "translate(" + i * 60 + "," + 0 +")");
var teamG = d3.selectAll("g.overallG")
teamG.append("circle")
.attr("r",20)
teamG.append("text")
.text(d => d.team)
.attr("y", 30)

dataKeys = Object.keys(incomingData[0])
.filter(d => d !== "team" && d !== "region")

d3.select("#controls").selectAll("button.teams")
.data(dataKeys).enter()
.append("button")
.html(d => d)
.on("click", buttonClick) ////// Why no parentheses here?


function buttonClick(datapoint) {
var maxValue = d3.max(incomingData, d => parseFloat(d[datapoint]))
var radiusScale = d3.scaleLinear().domain([0, maxValue]).range([2,20])
d3.selectAll("g.overallG").select("circle")
    .attr("r", d => radiusScale(d[datapoint]))
}

1 个答案:

答案 0 :(得分:4)

这里有两个问题:

  1. 为什么在onclick事件处理程序中调用函数时没有括号?
  2. 关于括号,如果你有它们......

    .on("click", buttonClick())
    

    ...您已将该功能的结果传递给事件监听器(在您的情况下为undefined),那不是您的意思想。

    相反,您希望在单击按钮时调用该函数,因此:

    .on("click", buttonClick)
    

    或者,或者:

    .on("click", function(){
        buttonClick()
    })
    
    1. 功能按钮如何知道接受"数据"属性绑定到每个按钮作为参数?
    2. 关于API的第一个参数是明确的:

        

      当在所选元素上调度指定事件时,将为元素评估指定的侦听器,传递当前数据(d),当前索引(i)和当前group(nodes),将其作为当前DOM元素(nodes [i])。 (强调我的)

      因此,您不需要明确指定第一个参数:默认情况下它将是基准。