2012-11-20 78 views
6

我目前做的鼠标点击事件处理我的D3可视化:d3.js的“单击”事件处理运行功能,无需点击事件

fooCircle.on("click",fooFunction("barParameter")); 

我的问题是,该功能,而无需我跑了点击元素。我知道这是因为我在函数中放置了打印语句。

有趣的是,当我改变了功能,不是一个函数,它在任何参数,函数的行为有它应该,这意味着,当我点击相应的元素上它就会跑:

fooCircle.on("click",fooFunction); 

回答

6

是,因为你在这个地方叫fooFunction你在哪里订阅点击处理程序:

fooCircle.on("click",fooFunction("barParameter"));// Calls fooFunction with param "barParameter" 

在那一刻,你看你的console.log,因为你刚刚调用的函数。

此外,我假设你的fooFunction不返回任何东西,这实际上意味着它返回undefined。那么订阅本质上变成:

fooCircle.on("click", undefined);// Nothing will happen since there's no handler 

这就是为什么第二个代码片段按照它应该工作的原因;因为你提供了一个函数来稍后调用。

虽然问题仍然存在,"barParameter"有什么意义?您是否需要将其他参数传递到fooFunction - di以外,d3在点击时调用处理程序时会提供哪些参数?

+0

我想我可以用d代替“barParameter”,如果我通过使用基准,数据或输入函数给元素提供必要的信息。目前在我的D3代码中,有问题的元素没有上述信息。无论哪种方式都很好。这取决于人们如何认为代码可读性更清晰。 –

+0

@meetamit你的答案提供了有用的信息。我也有同样的问题。如果我采用相同的代码片段,是的,我需要将某个变量传递给'fooFunction'。我怎样才能做到这一点? – RAS

+0

@RAS我认为tmnt-rafael的回答如下,解答你问的问题。如果你想更有趣,你可以阅读[部分应用功能](http://raganwald.com/2013/03/07/currying-and-partial-application.html)。 – meetamit

8

有人帮我解决了这个问题。解决的办法是做:

fooCircle.on("click", function() {fooFunction("barParameter"); }); 

这样,一个函数传递到功能上,而不是一个函数的结果。