我有一个简单的拖动事件 - 如果满足某个条件,我想强制取消当前正在进行的拖动(基本上就像你在做鼠标一样)。
像这样:
var drag_behavior = d3.behavior.drag()
.on("drag", function() {
if(mycondition){
// cancel the drag event
}
});
编辑:
目标只是阻止人们在某些边界之外拖动世界地图,以便在海洋中部渲染地图(详情如下)。
当前地图代码:
var width = window.innerWidth
var height = window.innerHeight
var projection = d3.geo.mercator()
.scale((width + 1) / 2 / Math.PI)
.translate([width / 2, height/1.5])
.precision(.1);
var path = d3.geo.path()
.projection(projection);
var drag_behavior_map = d3.behavior.drag()
.on("drag", function() {
drag_click = true //used later to prevent dragend to fire off a click event
d3.event.sourceEvent.stopPropagation();
// original idea
// if(worldmap_left_boundary > 0 || worldmap_right_boundary < screen.height){
// cancel or limit the drag here
// }
});
var svg = d3.select("#map").append("svg")
.attr("width", width)
.attr("height", height)
.call(drag_behavior_map)
基本上这不应该是可能的。
答案 0 :(得分:4)
在drag
事件函数中,您可以使用mycondition
来决定是否更新拖动元素的位置。不更新位置本质上意味着停止拖动。
您也可以取消订阅drag
活动:
var drag_behavior = d3.behavior.drag()
.on("drag", function() {
if(mycondition) {
// cancel the drag event
drag_behavior.on("drag", null);
}
});
请注意,除非您取消订阅该活动,否则仍会有dragend
个活动。
或者 - 尽管我并不完全熟悉触发原生事件及其对d3.behavior.drag()
的影响 - 您可以尝试触发原生mouseup
事件,看看会发生什么。
var drag_behavior = d3.behavior.drag()
.on("drag", function() {
if(mycondition) {
// "this" is the dragged dom element
this.dispatchEvent(new Event('mouseup'))
}
});