我有一个(相当简单的)问题:如何在D3.js的选择中“取消调用”force.drag?假设我创建了一组元素并在其上调用“call”,给它一个强制定向布局的拖拽回调。看起来像这样:
d3.selectAll('rect').call(force.drag);
现在可以在以后从某些节点中删除该行为。我的方法包括重置各种听众,例如“点击”,“拖动”等使用
d3.select('rect#no-drag').on('click', null);
他们都没有奏效。有人知道如何删除回调吗?
答案 0 :(得分:21)
你很亲密。拖动事件由mousedown
事件启动,其名称空间名为drag
。请参阅:https://github.com/mbostock/d3/blob/master/src/behavior/drag.js#L5
所以,要删除它,你可以这样做:
d3.select('rect#no-drag').on('mousedown.drag', null);
答案 1 :(得分:3)
这个问题并不是要问如何对拖拽元素进行细粒度控制,但是我来到这里寻找如何根据条件切换拖动开/关,并且提问者还询问了如何在拖拽之后取消阻力在评论中删除它。
因此,对于任何想要有条件地允许拖动事件的人,请使用drag.filter。
drag.filter
接受一个需要返回布尔值的回调。如果回调返回true,则发生拖动,否则不会触发拖动。
这比从选择中删除拖动然后尝试重新应用它要清晰得多。
答案 2 :(得分:1)
这条线不知道它不兼容移动设备(chrome / android)
d3.select('rect#no-drag').on('mousedown.drag', null);