【问题标题】:Drag not working correctly after node transition, D3节点转换后拖动无法正常工作,D3
【发布时间】:2015-10-06 13:41:51
【问题描述】:

我有一个类似这样的力量网络:

http://jsfiddle.net/Brb29/7/

按下按钮时,我将节点平移到相同的位置:

function positionnodes(){

     force.stop();
     nodes.each(function(d){
         d.fixed = true;
         d.x = 100;
         d.y = 100;
     }).transition().duration(1000).attr("transform", function(d)
    {

    //console.log(d.hasRelationship);
    //console.log(d.y);
    return "translate(" + 100 + "," + 100 + ")"; 

    });

    edges.transition().duration(1000).attr("x1", function (d) {

        console.log(d.source.x)
        return d.source.x;
    })
    .attr("y1", function (d) {console.log(d.source.y)
        return d.source.y;
    })
    .attr("x2", function (d) {console.log(d.target.x)

        return d.target.x;
    })
    .attr("y2", function (d) {console.log(d.target.y)
        return d.target.y;
    });
    //setTimeout(function(){ force.start();},1000);

}

我的问题是,在我这样做之后,我去拖动节点,即使我已经设置了节点位置,它也会跳回到之前的位置。 d.x/d.y 好像没有更新一样。

有什么想法吗?

【问题讨论】:

  • 它只是重力在起作用......但它不一定是同一个地方。例如,如果您拖动一个节点使节点的三角形旋转,然后释放它,它将返回中心但保持旋转。
  • 你点击按钮了吗?试试这个更新的小提琴:jsfiddle.net/Brb29/7
  • 是的,我尝试了您的新版本...我之前的评论仍然适用。尝试将重力设置为零并为节点设置初始 x 和 y 值(这样它们就不会尖叫离开页面并且永远不会回来)。
  • 这不是我的问题。我的问题是在我单击按钮之后尝试移动其中一个节点,而我没有单击的节点似乎移回了先前的位置,而不是停留在我放置它们的位置。我不认为它与重力有任何关系
  • 我不认为!=我不知道。试试看。

标签: javascript d3.js


【解决方案1】:

拖动事件会触发 force.start ,然后所有节点的 (x,y) 将被重新计算。为避免触发 force.start,您需要覆盖 force.drag 的事件处理程序,请参阅 here

好的。这是一个工作示例:Working Example。核心部分在这里:

var drag = force.drag()
                .origin(function(d) {
                    var t = 
d3.transform(d3.select(this).attr("transform")).translate;
                    return {x: t[0], y: t[1]};
                })
                .on("drag.force", function(d) {
                    var cord = [0,0];
                    cord = d3.mouse(this);
                    d.x = cord[0];
                    d.y = cord[1];
                    tick();
                });

【讨论】:

  • 好东西。知道问题出在哪里的人。欣赏答案:))))
  • 一件事。在测试您的解决方案时,一旦我运行它,我就会拖动蓝色的,它会拖动橙色和绿色的。有什么想法吗?
  • 最初,您调用 force.drag。单击按钮后,您将使用自定义的 force.drag 事件处理程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 2020-12-16
  • 2017-05-13
  • 2013-09-07
  • 2015-02-06
相关资源
最近更新 更多