繁体   English   中英

使用d3拖动行为的原点为树节点创建“拖动手柄”

[英]using d3 drag behavior's origin to create a “drag handle” for a tree node

我对d3来说还比较陌生,但我仍然碰到让我感到困惑的事情。

基本上,我有一棵带有可拖动节点的树。 我想将节点的“拖动句柄”限制为仅圆,而不是圆和文本(以及我最终添加的其他内容)。

我知道这与在拖动行为中正确设置原点有关,但是我似乎不太了解。

我在这里找到了一些有关stackoverflow的有用信息(对不起,我只能发布两个链接),然后查看https://groups.google.com/forum/#!topic/d3-js/fjp1mpvVW1M , m将拖动行为应用于g容器的子元素,然后尝试将转换应用于其g容器。

我该怎么做?

这是相关代码:

var dragListener = d3.behavior.drag()
.origin(function () {
    var t = d3.select(this);
    return {
        x: t.attr("x") + d3.transform(t.attr("transform")).translate[0],
        y: t.attr("y") + d3.transform(t.attr("transform")).translate[1]
    };
})
.on("drag", function (d) {
    d.x0 += d3.event.dy;
    d.y0 += d3.event.dx;       
    //var node = d3.select(this);  //this works
    var node = d3.select(this.parentNode)  //this doesn't work
    node.attr("transform", "translate(" + d.y0 + "," + d.x0 + ")");
});

  var nodeEnter = node.enter().append("g")
  //.call(dragListener)  // this works
  .attr("class", "node")
  .attr("transform", function(d) { return "translate(" + source.y0 + "," + source.x0 + ")"; })
  .on("click", click);

  nodeEnter.append("circle")
  .call(dragListener)  // this doesn't work
  .attr("r", 1e-6)
  .style("fill", function(d) { return d._children ? "lightsteelblue" : "#fff"; });

这是一个小提琴: http : //jsfiddle.net/tsmith77/4R3Cb/

UPDATE

我无法让子组做我想做的事,但是我通过截取文本上的mousedown事件来实现了我想做的事:

  nodeEnter.append("text")
  .on("mousedown", function (d) {
      d3.event.stopPropagation();
      })
  .on("click", function (d) {
      alert("text clicked");
  })

这样可以防止文本成为拖动手柄,但仍然允许我在单击文本时执行操作。

在CSS中为与节点对应的文本设置以下行:

  pointer-events: none;

(一种方法是将一个名为“ node-label ”的类分配给所有此类文本,然后如上所述定义该类的属性“ pointer-events ”)

这将防止通过抓取文本进行拖动。

我还将给您提供两个实时示例。 它们处理的是力量布局,而不是像您这样的树,但没关系,原理是相同的。

示例1-通过同时抓住圆圈和标签可以拖动

示例2-仅抓住圆圈即可拖动

它们之间的区别仅在于行:

  pointer-events: none;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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