根据所需的整体解决方案,您可以在其中一个 SVG 元素上放置一个处理程序,以便它只触发或检查它是否是正确的目标。
因此,当您单击它时选择一个状态,并将处理程序放在该状态而不是圆圈上(您可以使用指针事件禁用:无)。
所以你是在“拖动”状态,但在移动圆圈。我们为此编写了自己的自定义处理程序。
这不是一个完整的解决方案,它需要一些进一步的边缘案例测试,例如拖动到新状态,或者不拖动/单击地图之外。它只是一种可能的方式的想法,通过使用事件本身来限制其拖动。
jsfiddle
Snap.load( "https://upload.wikimedia.org/wikipedia/commons/3/32/Blank_US_Map.svg", onSVGLoaded )
function onSVGLoaded( frag ) {
s.append( frag );
s.click( addCircle )
}
function addCircle(ev, x, y) {
var t = Snap(ev.target)
if(( t.data('dragEl') == undefined ) && ( dragging == false ) ) { // We only want one circle on a state
var c = s.circle( x-10, y-10, 10)
.attr({ style: 'pointer-events: none; opacity: 0.5' });
t.drag( dragMove, dragStart, dragStop ).data('dragEl', c)
}
}
function dragStart( x, y, ev ) {
this.data('targetState', ev.target.id );
}
function dragMove(dx,dy,x,y,ev) {
if( ev.target.id != this.data('targetState')) { return } // Check the event isn't coming from a different state
this.data('dragEl').attr({ cx: x-10, cy: y-10 })
dragging = true;
}
function dragStop() { // prevent dragend causing new click
setTimeout( function(){ dragging = false; }, 300);
}