繁体   English   中英

d3.js强制取消拖动事件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM