2012-10-30 85 views
10

我有一個(相當簡單)的問題:如何對由D3.js所做的選擇「un-call」force.drag?比方說,我創建了一組元素並在其上調用「調用」,爲它提供了強制定向佈局的拖動回調。看起來像這樣:D3.js:從選擇中刪除force.drag

d3.selectAll('rect').call(force.drag); 

現在應該可以從稍後的一些節點中刪除該行爲。我的方法包括重置各種聽衆,如「點擊」,「拖動」等。使用

d3.select('rect#no-drag').on('click', null); 

他們都沒有工作。有誰知道如何刪除回調?

回答

19

你就近了。拖動事件由名爲drag的名稱空間的mousedown事件啓動。請參閱:https://github.com/mbostock/d3/blob/master/src/behavior/drag.js#L5

因此,要消除這種你可以這樣做:

d3.select('rect#no-drag').on('mousedown.drag', null); 
+0

完美解決它,我只是試了一下,它的工作原理:) 在D3.js中默認命名空間是事件嗎? – user654123

+0

是的。此外,如果您添加自己的事件偵聽器,則可以對它們進行命名空間。它們可以使用多個監聽器來監聽同一個事件。 – nautat

+0

好吧,我已經熟悉jQuery插件開發中的命名空間事件。似乎D3.js讓你只爲每個有資格的事件註冊一個回調,因此它對命名空間是有意義的。再次感謝。 – user654123

1

這行不知它不適合移動設備兼容(鉻/機器人)

d3.select('rect#no-drag').on('mousedown.drag', null); 
2

這個問題是不是問如何對拖動元素有精細的控制,但是我來到這裏尋找如何根據條件切換拖動的開關狀態,並且提問者還詢問了如何在評論中刪除拖動之後獲取拖動。

因此,對於任何想要如何有條件地允許拖動事件的人,請使用drag.filter

drag.filter需要一個需要返回布爾值的回調函數。如果回調函數返回true,則發生拖動,否則拖動不會觸發。

這比從選擇中刪除拖拽然後嘗試重新應用它要乾淨得多。

+0

你遲到了到遊戲,但您的意見非常感謝,謝謝! – user654123