【问题标题】:StopPropagation() with SVG element and G带有 SVG 元素和 G 的 StopPropagation()
【发布时间】:2012-07-25 08:52:06
【问题描述】:

我创建了一个具有 .on("click") 行为的 SVG 元素,并用 .on("click") 附加了 g 元素,并认为我可以使用 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");
}

【问题讨论】:

    标签: d3.js svg dom-events stoppropagation


    【解决方案1】:

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

    通常,单击手势会按顺序引发mousedownmouseupclick 事件。

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

    这里是an example,展示了它在与您的情况类似的情况下的使用。

    【讨论】:

    • 嗨,Jason,我仍然不清楚代码的外观。我需要 上的事件是 mousedown 事件,我需要 上的事件是 click 事件。我更新了网站以包含以下内容但没有更改:.on('mousedown', function(){ d3.event.sourceEvent.stopPropagation(); })
    • 您需要使用d3.event.stopPropagation()。您的代码将不起作用,因为 d3.event.sourceEvent 未定义。我现在也为你添加了一个示例。
    • 我忘了说我试过event、event.source和event.target都没有效果。我只是复制粘贴在其他 D3 演示中使用的各种 stopPropagation() 术语。但是你的演示很棒,正是我需要理解的。
    • 很好的链接,完美的解释
    猜你喜欢
    • 2014-11-08
    • 2017-04-09
    • 2019-05-15
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多