15

我创建了一个带有.on("click")行为的 SVG 元素,并添加了 g 元素,.on("click")并认为我可以使用它d3.event.stopPropagation()来防止 SVG 点击事件被 g 点击事件触发。相反,这两个事件继续触发。所以我必须把stopPropagation 放在错误的地方。

svg = d3.select("#viz").append("svg:svg")
    .attr("width", 800)
    .attr("height", 800)
    .on("mousedown", mousedown);

sites = svg.selectAll("g.sites")
    .data(json.features)
    .enter()
    .append("svg:g")
    .on("click", siteClick)
    ;

sites.append("svg:circle")                
    .attr('r', 5)
    .attr("class", "sites")
    ;

function mousedown() {
    console.log("mouseDown");
}

function siteClick(d, i) {
    d3.event.stopPropagation();
    console.log("siteClick");
}
4

1 回答 1

25

你似乎混淆了clickmousedown事件。调用stopPropagation一次只会阻止一个事件的传播,这些是单独的事件。

通常,单击手势将按该顺序引发mousedown和事件。mouseupclick

您可以将click事件处理程序保留在子元素上并mousedown通过调用添加事件处理程序stopPropagation,这应该可以实现您所追求的。

这是一个示例,展示了它在与您的情况类似的情况下的使用。

于 2012-07-26T23:21:34.233 回答