d3.js强制取消拖动事件

时间:2014-01-02 03:00:45

标签: javascript jquery events d3.js

我有一个简单的拖动事件 - 如果满足某个条件,我想强制取消当前正在进行的拖动(基本上就像你在做鼠标一样)。

像这样:

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)

This should not be possible

基本上这不应该是可能的。

1 个答案:

答案 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'))
    }
  });