2012-10-30 59 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