[英]Performing double mouseup events with other element in d3
我试图在我的节点上发出一个鼠标事件,用于在mousedown上出现的周围弧。
我的预期功能是能够按住节点并将其拖动到弧形中,触发弧线以及节点的mouseup事件。 我在使用下面的JSFiddle中引用的当前代码时遇到问题,非常感谢您的帮助!
对于我的弧线,我有以下代码,我希望在将鼠标放在特定弧线上方时执行鼠标操作:
slices.append('path')
...
.on('mouseup', function(arc) {
console.log(arc.data.title)
}
);
我还希望在特定弧顶部拖动节点并释放鼠标按钮后运行节点的鼠标:
svg.append("g")
.attr("class", "node")
.selectAll(".bubble")
.data(data, function(d){ return d.id; })
.enter().append("circle")
...
.on('mousedown', nodeClickedArcs)
.on('mouseup', removeArcs)
谢谢!
这里的关键挑战是鼠标事件基本上被圆圈吸收。 您也许可以这样的方式对元素进行排序,即弧的父g
保持带有圆圈的子g
,以允许事件传播到相关的父级,但是然后您的圆圈位于弧的下方。
我将在下面演示的一个选项是在拖动期间从节点剥离指针交互。 例如,这不会中断拖动(在Chrome,Firefox,IE上测试),但允许鼠标与鼠标悬停/鼠标移出事件的其他元素进行交互。 然后我们可以监听鼠标进入(并退出)目标形状,如果拖动结束(鼠标向上)目标形状,我们可以触发特定动作。
这要求鼠标向上的所有事件逻辑都位于拖动结束功能中,但需要用于鼠标进入/退出目标形状的监听器。
基于以上所述,在下面的代码片段中我:
在下面的代码段中,我删除了节点(圆圈),如果它们在目标形状(矩形)上,则更新过程中的矩形颜色:
var svg = d3.select("body") .append("svg") .attr("width", 500) .attr("height", 300); var drag = d3.drag() .on("drag",dragged) .on("end", dragEnd); var squares = svg.selectAll("rect") .data([{x:30},{x:130},{x:230},{x:330},{x:430}]) .enter() .append("rect") .attr("x", function(d) { return dx; }) .attr("y", 120) .attr("width", 40) .attr("height",40) .attr("fill","white") .on("mouseenter", function(d) { d.active = true; }) .on("mouseout", function(d) { d.active = false; }); var circles = svg.selectAll("circle") .data(d3.range(20)) .enter() .append("circle") .attr("cx", function(d) { return d/21*500 + 25; }) .attr("cy", function(d) { return d%2 * 40 + 50; }) .attr("r", 10) .attr("fill", function(d) { return d3.schemeCategory20[d]; }) .call(drag); function dragged(d) { var x = d3.mouse(this)[0]; var y = d3.mouse(this)[1]; d3.select(this) .attr("cx",x) .attr("cy",y) .style("pointer-events","none"); } function dragEnd(d) { var rect = squares.filter(function(d) { return d.active; }) if(!rect.empty()) { var circle = d3.select(this); rect.attr("fill",interpolateColor(rect,circle)); circle.remove(); } else { d3.select(this).style("pointer-events","all"); } } function interpolateColor(r,c) { return d3.interpolateLab(r.attr("fill"),c.attr("fill"))(0.5) }
svg { stroke: black; stroke-width: 2px; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script>
这会检查鼠标位置,而不是圆圈与矩形重叠,碰撞检测需要采用不同的方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.