Javascript 是否在单击/悬停的节点上显示名称?(D3.js第4版)

Javascript 是否在单击/悬停的节点上显示名称?(D3.js第4版),javascript,d3.js,Javascript,D3.js,当前,我已显示节点的名称。我想我只希望在用户单击节点或将鼠标悬停在节点上时显示节点的名称(将在测试我喜欢的内容后决定) 要显示文本,我当前有以下选项: var nodes_text = svg.selectAll(".nodetext") .data(nodes) .enter() .append("text") .attr("class", "nodetext slds-text-heading--label")

当前,我已显示节点的名称。我想我只希望在用户单击节点或将鼠标悬停在节点上时显示节点的名称(将在测试我喜欢的内容后决定)

要显示文本,我当前有以下选项:

var nodes_text = svg.selectAll(".nodetext")
        .data(nodes)
        .enter()
        .append("text")
        .attr("class", "nodetext slds-text-heading--label")
        .attr("text-anchor", "middle")
        .attr("dx", -20)
        .attr("dy", 20)
        .text(function(d) {
            return  d.name;
        });
我最初的想法是删除上面代码中的最后一条语句,并将其移动到“onclick”事件中

但是,这仅在出于某种原因单击中心节点时有效。我想知道是否有更明显的方法。我的节点数据存储在一个名为“节点”的数组中

编辑:这里是一些测试数据的拼图,显示了基本问题。单击紫色节点有效,但其他节点无效
由于文本和圆圈有两种不同的选择(不是传统方法中包含这些元素的组),一种可能的解决方案是根据单击的圆圈过滤文本:

svg.selectAll("circle").on("click", function(d) {
    svg.selectAll(".nodetext").filter(function (e){ 
        return e.name === d.name})
    .text(function(d) {
        return  d.name;
    });

这里是更新提琴:

由于文本和圆圈有两种不同的选择(不是传统方法中包含这些元素的组),一种可能的解决方案是根据单击的圆圈过滤文本:

svg.selectAll("circle").on("click", function(d) {
    svg.selectAll(".nodetext").filter(function (e){ 
        return e.name === d.name})
    .text(function(d) {
        return  d.name;
    });

下面是更新提示:

代码中有几个问题

  • 您正在为
    节点圆
    节点文本
    元素绑定相同的数据,因此将它们分组到一个
    g
    元素中是有意义的

  • 您正在尝试仅处理一个元素上的单击事件
    svg。选择(“圆圈”)。单击(“单击”,处理程序)

    这只选择并处理最后一个元素的事件,您必须使用
    selectAll
    -
    svg.selectAll(“圆圈”)。在(“单击”,处理程序)

  • 处理函数中的相同内容
    svg.select(“.nodetext”).text(函数(d){return d.name;})
    您还在这里选择最后一个元素

  • 与其在单击时设置
    text
    属性,不如先设置它们,然后在
    hover&click上显示并隐藏它

    正如Gerardo提到的,你必须根据圆圈点击过滤节点, 但如果两个节点具有相同的名称呢?我还为节点生成了
    id
    ,并使用该id对它们进行了过滤


  • 请参阅更新的

    代码中有几个问题

  • 您正在为
    节点圆
    节点文本
    元素绑定相同的数据,因此将它们分组到一个
    g
    元素中是有意义的

  • 您正在尝试仅处理一个元素上的单击事件
    svg。选择(“圆圈”)。单击(“单击”,处理程序)

    这只选择并处理最后一个元素的事件,您必须使用
    selectAll
    -
    svg.selectAll(“圆圈”)。在(“单击”,处理程序)

  • 处理函数中的相同内容
    svg.select(“.nodetext”).text(函数(d){return d.name;})
    您还在这里选择最后一个元素

  • 与其在单击时设置
    text
    属性,不如先设置它们,然后在
    hover&click上显示并隐藏它

    正如Gerardo提到的,你必须根据圆圈点击过滤节点, 但如果两个节点具有相同的名称呢?我还为节点生成了
    id
    ,并使用该id对它们进行了过滤


  • 请参见更新的

    ,您总是选择第一个元素。如果您需要帮助,您必须提供圆的代码和数据数组的示例。如果您希望更快地获得帮助,最好创建一个jsfiddle/plunker/codepen/blocks/which。同时,我投票决定结束这个问题:“寻求调试帮助的问题必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。”如果JFIDLE允许我编辑问题,我想我可以提供JFIDLE。说最短的代码是必需的,所以我想我不想提供整个程序。不过我会尽量简化。很好,我刚刚撤回了我的投票。你总是选择第一个元素。如果您需要帮助,您必须提供圆的代码和数据数组的示例。如果您希望更快地获得帮助,最好创建一个jsfiddle/plunker/codepen/blocks/which。同时,我投票决定结束这个问题:“寻求调试帮助的问题必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。”如果JFIDLE允许我编辑问题,我想我可以提供JFIDLE。说最短的代码是必需的,所以我想我不想提供整个程序。不过我会尽量简化。好的,我刚刚撤回了我的投票。