D3.js动态设置节点可见性

d3.js dynamically set node visibility

本文关键字:点可见性 设置 动态 js D3      更新时间:2023-09-26

在d3中.js我有一个不同节点的力布局。所有这些不同的节点都是不同组的一部分。对于每个组,我都有一个"超级节点",我想代表所有正常节点。这就是我定义节点的方式:

//Nodes are defined.
            var node = g.selectAll(".node")
                .data(nodes);
            var nodeEnter = node.enter().append("g")
                .attr("class", "node");

            //Image is added for each node, depending on what type it is.
            nodeEnter.append("image")
                .attr("xlink:href", function(d) {
                    if (d.id == "supernode") {
                        return "../icons/supernodes/" + d.type + ".png";
                    } else {
                        return "../icons/" + d.type + ".png";
                    }
                })
                .attr("x", -25)
                .attr("y", -25)
                .attr("width", 50)
                .attr("height", 50);
                // .style("visibility", function(d) {          
                //     return d.id == "supernode" ? "hidden" : "visible";
                // });

我有一个按钮,当我单击时,我想在显示超级节点和隐藏节点之间切换,反之亦然。我检查哪一个应该发生在一个名为"superNodeDisplay"的布尔值中。我有一种方法可以切换可见性:

        var superNodeShown = false;
        function bundleNodes() {
                console.log("before",node);
                if (!superNodeShown){
                        node.style("visibility", function(d) {
                        if (d.id =="supernode") return "visible";
                        else return "hidden";
                    });
                }
                else{
                    node.style("visibility", function(d) {
                        if (d.id =="supernode") return "hidden";
                        else return "visible";
                    });
                }
                superNodeShown = !superNodeShown;
                console.log("after",node);
            }
            //button click event
            d3.select('#buttonTest').on('click', function() {
                bundleNodes();
            });

现在,当您看到用于定义节点的代码时,我已经注释掉了样式。这样它就可以正常工作,节点在单击按钮时切换。但是,以这种方式,当我启动页面时,所有节点,正常节点和超级节点都是可见的。我希望在启动时只有普通节点可见(您可以通过查看注释掉的nodeEnter.style来判断)。如果我取消注释该部分代码,它将不再起作用。

我可以在您的代码中找到以下问题。

  • 像这样有一个错误的分号.attr("height", 50);.style(...这可能是一个错字。

  • 您应该隐藏节点组元素,而不是单独隐藏图像。

试试这种方式。

nodeEnter.style("visibility", function(d) {          
    return d.id == "supernode" ? "hidden" : "visible";
});