如何删除可拖动组中某个元素上的拖动事件
How can I remove drag event on one element in a draggable group?
我有一个可拖动的组,该组中的一个元素调用了click event。现在我想删除该元素上的拖动事件。看见http://jsfiddle.net/gLvyouct/1/
我尝试过这些方法:
-
添加
circle.call(drag).on(".drag", null);
不工作,我不知道为什么。
-
仅调用rects 上的拖动事件
将影响拖拽事件的流畅性。图元在拖动时会发生抖动。
-
在阻力行为定义中
if (d3.event.sourceEvent.target.nodeName == "circle") return;
不起作用。当鼠标位于圆的边缘时,该组仍在移动。
这是一个棘手的问题,因为如果将拖动事件绑定到rect
,然后移动rect所属的g
,则在每个事件触发后,d3.event
对象中计算的dx
和dy
值将被打乱,因为这些计算值已被转换到拖动行为绑定的元素的局部坐标系中。因此,我们可以自己做一些类似的事情来解决这个问题。这里的诀窍是,我们只需要计算出鼠标在拖动过程中x
和y
位置的变化。并且d3使得这些在d3.event
对象的sourceEvent
属性中可用。
因此,使用d3.event
对象中的底层sourceEvent
来获得clientX
和clientY
的位置,并计算上一个值和当前值之间的差,这将告诉您需要translate
和g
元素的额外距离。你还需要初始化你要比较的值,这样你就不会在一开始就得到随机跳跃。幸运的是,我们可以使用dragstart
事件来做到这一点。
一旦我们弄清楚了这一点,我们就可以将drag
处理程序绑定到rect
,我们应该可以开始了。
下面是一个我所描述的例子。
var g = d3.select("#mysvg").append("g");
var rect = g.append("rect").attr("height", 100).attr("width", 100);
var circle = g.append("circle").attr("cx", 200).attr("cy", 200).attr("r", 50).attr("fill", "black");
var transX = 0, transY = 0;
var lastX = 0, lastY = 0;
var drag = d3.behavior.drag().on("drag", function() {
transX += d3.event.sourceEvent.clientX - lastX;
transY += d3.event.sourceEvent.clientY - lastY;
g.attr("transform", "translate(" + transX + "," + transY + ")");
lastX = d3.event.sourceEvent.clientX;
lastY = d3.event.sourceEvent.clientY;
}).on("dragstart", function() {
lastX = d3.event.sourceEvent.clientX;
lastY = d3.event.sourceEvent.clientY;
});
rect.call(drag);
circle.on("click", function() {
var now_color = d3.select(this).attr("fill");
if (now_color == "black")
d3.select(this).attr("fill", "green");
else
d3.select(this).attr("fill", "black");
});
//circle.call(drag).on(".drag", null);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<svg id="mysvg" height="800" width="800"></svg>
- 如何使元素在可拖动元素内可单击
- 拖动开始时更改可拖动元素的大小
- 无法为HTML5中具有画布和图像的可拖动元素设置“拖动图像”
- 具有可拖动元素的HTML到PDF
- 可缩放容器鼠标上的可拖动元素在创建时从辅助对象上浮动
- 删除所有可拖动元素后如何显示消息
- 将可拖动元素与从父项位置开始的网格对齐
- 拖动元素时,如何获取要替换的元素的位置
- 将id为X的可拖动元素拖放到id为Y的容器
- 在没有jQuery的情况下拖动元素
- 可拖动元素在悬停在另一个'It’s draggable
- 拖动时更改HTML5可拖动元素的“克隆”文本
- Javascript:当元素中有<选择>时,可拖动元素搞砸了
- 是否有可能知道 jquery 可拖动元素将恢复到哪里
- 如何将键控事件与 JQuery-ui 可拖动元素一起使用
- jQuery UI 可拖动元素位于其他可拖动元素下
- 从拖动元素中获取 HTML5 自定义数据属性
- 使用 D3.js 拖动元素时滚动
- 同步两个可拖动元素的位置
- 如何从可拖动元素中删除项目符号