2012-11-20 79 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"); }); 

這樣,一個函數傳遞到功能上,而不是一個函數的結果。