d3 sankey svg 文本 tspan - 单击不起作用

d3 sankey svg text tspan - on click not working

我使用的是相当典型的 d3 sankey,使用 tspan 对矩形的标签进行了一个小改动以包含 3 行文本...代码如下所示:

<svg>
  <g>
   <g></g>
   <g></g>
   ...
  </g>
  <g>
    <g class="node" transform="translate(1224,183.54665552874204)">
      <rect height="3.1713693459563146" width="15" class="svg-rect-17" style="stroke: none;">
        <title>1,079</title>
      </rect>
      <text text-anchor="end" class="svg-text-17" transform="">
        <tspan x="-10" text-anchor="end" y="3.1713693459563146" class="">1,079</tspan>
        <tspan x="20" text-anchor="end" y="43.171369345956315" class="calc-total">Execution Fallout</tspan>
        <tspan x="20" text-anchor="end" y="73.17136934595632" class="calc-total">4,904</tspan>
      </text>
    </g>
    <g></g>
    ...
  </g>
</svg>

我试图通过将以下内容添加到 tspan 附加调用来使具有 class "calc-total" 的项目可点击:

.on('click',function(d) { console.log('label',d) });

可以在此处的上下文中看到:

//sankey node text block
var tspan = node
    .append("text")
    .attr("text-anchor", "end")
    .attr("class", function (d) {
        return "svg-text-"+d.id+" svg-text-" + d.type;
    })
    .attr("transform", function(d) { return (d.id==0) ? "rotate(270,10,20)" : ""});


//node data
tspan.append("tspan")
    .attr("x", function (d) {
        return calcXP(d, 'data', false)
    })
    .attr("text-anchor", function (d) {
        return calcAnc(d, 'data', false);
    })
    .attr("y", function (d) {
        return calcYP(d, 'data', false)
    })
    .text(function (d) {
        return numberWithCommas(d.total);
    })
    .attr("class", function (d) {
        return "data-" + d.type + " data-" + d.type + (d.subtype ? "-" + d.subtype : "");
    });

//node label total
tspan.filter(function (d) {
    return d.subtype && d.subtype == 'undefined';
}).append("tspan")
    .attr("x", function (d) {
        return calcXP(d, 'label', true)
    })
    .attr("text-anchor", function (d) {
        return calcAnc(d, 'label', true);
    })
    .attr("y", function (d) {
        return calcYP(d, 'label', true)
    })
    .text(function (d) {
        return d.category;
    })
    .attr("class", "calc-total")
    .on('click',function(d) { console.log('label',d) });

//node data total
tspan.filter(function (d) {
    return d.subtype && d.subtype == 'undefined';
}).append("tspan")
    .attr("x", function (d) {
        return calcXP(d, 'data', true)
    })
    .attr("text-anchor", function (d) {
        return calcAnc(d, 'data', true);
    })
    .attr("y", function (d) {
        return calcYP(d, 'data', true)
    })
    .text(function (d) {
        return numberWithCommas(totalByCat[d.category]);
    })
    .attr("class", "calc-total")
    .on('click',function(d) { console.log('data',d) });

我还根据其他 Whosebug 发现添加了以下 CSS:

svg text, svg text tspan {
    pointer-events: none;
    display: block;
}

无论我做什么,我都无法点击 text/tspan。我试过使用 jquery 引用 classes,我试过将它放在文本上,以及 tspan 附加区域......我很难过。我希望得到一些帮助。

再一次,我的目标是同时拥有 class = "calc-total" 可点击的 tspan 和 运行 JS 方法(不是 link)。

提前致谢。

对于对此功能感兴趣的人;我确实让它工作了,但是,它不是很优雅。

我永远无法获得在 sankey 上调用 javascript 的 tspan 或文本。奇怪的是,我很容易在可折叠树和其他 d3 svg 元素上完成这项工作,但 sankey 困扰了我好几天。

我最终将一个 svg Rect 放置在我希望可点击的文本的顶部。将其设置为透明。将 .call(call(d3.behavior.drag()... 添加到矩形,并在 dragstart 上触发我的动作,并且不执行任何拖动操作。

呃...但它有效。