禁用缩放但在 foreignObject 上检索滚动

Disable zoom but retrieve scroll on foreignObject

我正在使用 d3.js + AngularJS 来创建一棵树。
树是可缩放的,这是我通过执行以下操作实现的行为(如文档中所推荐的那样 - 请注意我使用的是 v3:https://devdocs.io/d3~3/zoom-behavior.md#zoom):

let zoom = d3.behavior.zoom()
    .scaleExtent([.5, 2])
    .on("zoom", function() {
        svg.attr("transform",  "translate(" + d3.event.translate + ") scale(" + d3.event.scale + ")");
    });

svg = d3.select(".tree-div")
    .append("svg")
    .call(zoom)
    .append("g");

最近,我在树的节点上添加了工具提示。工具提示在 Angular 指令中生成。

d3.selectAll(".tree-node").append("g")
    .classed("tree-node-tooltip", true)
    .call(function() {
         $compile(this[0])($scope);
    });

这些工具提示由条形图 + 应该是可滚动的 foreignObject 组成 div。但是我从来没有设法让 foreignObject 放弃缩放行为并检索滚动行为。

我看到了一些说明类似问题的帖子,但我找到的 none 解决方案对我有用。我尝试了以下方法:

直接在工具提示上禁用缩放

使用多种:

.attr("classed", "tree-node-tooltip") 之后。缩放行为保持不变。

在缩放处理程序上过滤

.on("zoom", function() {
    if (mouse is over tooltip) {
        return;
    }
    svg.attr("transform",  "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
});

这会禁用缩放,但也会禁用本机滚动。

我也尝试停止传播事件(在 zoomzoomstart 上),没有效果(缩放仍然存在)。

你知道我该怎么做吗?我完全被困在这里。任何帮助将不胜感激,谢谢。

您可以在 D3 选择上添加侦听器,这样您就可以停止事件传播:

d3
 .selectAll(...)
 .call(...)
 .on("wheel", 
    function() { 
        d3.event.stopPropagation();
    })