[英]d3.js force cancel a drag event
我有一个简单的拖动事件-如果满足特定条件,我想强制取消当前正在进行的拖动(基本上就像在做mouseup一样)。
像这样:
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)
基本上这是不可能的。
在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()
影响, 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'))
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.