【问题标题】:d3 How do I know if the click is on a line?d3 我如何知道点击是否在线?
【发布时间】:2015-07-16 12:15:55
【问题描述】:

代码取自Live drawing of a line in D3.js

var line;

var vis = d3.select("body").append("svg") 
    .attr("width", 600)
    .attr("height", 400)
    .on("mousedown", mousedown)
    .on("mouseup", mouseup);

function mousedown() {
    var m = d3.mouse(this);
    line = vis.append("line")
        .attr("x1", m[0])
        .attr("y1", m[1])
        .attr("x2", m[0])
        .attr("y2", m[1]);

    vis.on("mousemove", mousemove);
}

function mousemove() {
    var m = d3.mouse(this);
    line.attr("x2", m[0])
        .attr("y2", m[1]);
}

function mouseup() {
    vis.on("mousemove", null);
}

我如何知道用户是否点击了之前添加的行?在 mousedown() 函数中,我只希望在用户单击 svg 时添加一个新行,而不是附加到 svg 的行。

本质上,在mousedown()函数中,怎么说如果m != line,则继续追加一行?

【问题讨论】:

    标签: javascript d3.js svg


    【解决方案1】:

    @michael 你可以做这样的事情来知道它是用户点击的线条还是 svg。

    function mousedown() {
        var m = d3.mouse(this);
        line = vis.append("line")
            .attr("x1", m[0])
            .attr("y1", m[1])
            .attr("x2", m[0])
            .attr("y2", m[1]);
        if (d3.event.srcElement.tagName == "svg"){
            //handle svg
        } else if (d3.event.srcElement.tagName == "line"){
            //handle line
        }
        vis.on("mousemove", mousemove);
    }
    

    【讨论】:

    • 谢谢,如果您能提供帮助,我会跟进。现在整条线都是可修改的(这很棒),但前提是这条线不在起点。是否有一种简单的方法可以在起点的线端点处获得行为?这是我的小提琴:jsfiddle.net/da37B/303
    • 你说的“线不在起点”是什么意思 你是说要从末端延长线吗?
    • 不,在我的jsfiddle中,当点击该行时,可以修改它但起点保持不变。如果我在线的起点附近单击,有没有办法将起点更改为线的终点,这意味着它现在可以以其他方式修改?此外,您的解决方案适用于一条线,但如果有很多线,则该行为仅适用于最后绘制的线。抱歉,如果这令人困惑,但我非常感谢您的帮助。
    • @MichaelRichter 对于第二个问题,创建的最后一行总是在更新,你没有设置行变量。我在这里完成了jsfiddle.net/cyril123/waszdyhg/1 检查其他是否阻塞。
    • 再次感谢您的帮助。效果很好。第一个问题可能相当困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    相关资源
    最近更新 更多