D3将HTML附加到节点

时间:2014-07-18 14:36:22

标签: javascript d3.js

我已经找到了答案,但在我的情况下,没有类似的问题可以帮助我。我有一个D3树,在运行时创建新的节点。当我将鼠标悬停在特定节点上时,我想将HTML(因此我可以格式化)添加到节点。现在我可以添加HTML但它没有格式化。请帮忙!

JSFiddle:http://jsfiddle.net/Srx7z/

JS代码:

 var width = 960,
            height = 500;

    var tree = d3.layout.tree()
            .size([width - 20, height - 60]);

    var root = {},
            nodes = tree(root);

    root.parent = root;
    root.px = root.x;
    root.py = root.y;

    var diagonal = d3.svg.diagonal();

    var svg = d3.select("body").append("svg")
            .attr("width", width)
            .attr("height", height)
            .append("g")
            .attr("transform", "translate(-30,40)");

    var node = svg.selectAll(".node"),
            link = svg.selectAll(".link");

    var duration = 750;

    $("#submit_button").click(function() {
        update();
    });
    function update() {
        if (nodes.length >= 500) return clearInterval(timer);

        // Add a new node to a random parent.
        var n = {id: nodes.length},
                p = nodes[Math.random() * nodes.length | 0];
        if (p.children) p.children.push(n); else p.children = [n];
        nodes.push(n);

        // Recompute the layout and data join.
        node = node.data(tree.nodes(root), function (d) {
            return d.id;
        });
        link = link.data(tree.links(nodes), function (d) {
            return d.source.id + "-" + d.target.id;
        });

        // Add entering nodes in the parent’s old position.
        var gelement = node.enter().append("g");

        gelement.append("circle")
                .attr("class", "node")
                .attr("r", 20)
                .attr("cx", function (d) {
                    return d.parent.px;
                })
                .attr("cy", function (d) {
                    return d.parent.py;
                });

        // Add entering links in the parent’s old position.
        link.enter().insert("path", ".g.node")
                .attr("class", "link")
                .attr("d", function (d) {
                    var o = {x: d.source.px, y: d.source.py};
                    return diagonal({source: o, target: o});
                })
                .attr('pointer-events', 'none');

        node.on("mouseover", function (d) {
            var g = d3.select(this);
            g.append("text").html('First Line <br> Second Line')
            .classed('info', true)
            .attr("x", function (d) {
                return (d.x+20);
            })
            .attr("y", function (d) {
                return (d.y);
            })
            .attr('pointer-events', 'none');


        });

        node.on("mouseout", function (d) {
            d3.select(this).select('text.info').remove();
        });


        // Transition nodes and links to their new positions.
        var t = svg.transition()
                .duration(duration);

        t.selectAll(".link")
                .attr("d", diagonal);

        t.selectAll(".node")
                .attr("cx", function (d) {
                    return d.px = d.x;
                })
                .attr("cy", function (d) {
                    return d.py = d.y;
                });
    }

1 个答案:

答案 0 :(得分:26)

使用Lars Kotthoff的优秀方向,我得到了它的工作,所以我决定将它发布给其他人和我自己的参考:

http://jsfiddle.net/FV4rL/2/

附加以下代码:

node.on("mouseover", function (d) {
            var g = d3.select(this); // The node
            var div = d3.select("body").append("div")
                    .attr('pointer-events', 'none')
                    .attr("class", "tooltip")
                    .style("opacity", 1)
                    .html("FIRST LINE <br> SECOND LINE")
                    .style("left", (d.x + 50 + "px"))
                    .style("top", (d.y +"px"));
});