单击D3.js中的特定节点时,访问JSON中的值

时间:2015-10-05 23:24:14

标签: javascript d3.js

我在D3中使用pack布局如下:

var margin = 20,
diameter = 500;

var color = d3.scale.linear()
//var color = ['steelblue','green','grey']
    //.domain([3, 4])
    .range(["steelblue", "#81CFE0", "darkslategrey"])
    .interpolate(d3.interpolateHcl);

var pack = d3.layout.pack()
    .padding(2)
    .size([diameter - margin, diameter - margin])
    .value(function(d) { return d.size; })

var svg = d3.select("body").append("svg")
    .attr("width", diameter)
    .attr("height", diameter)
    .append("g")
    .attr("transform", "translate(" + diameter / 2 + "," + diameter / 2 + ")");

d3.json("data.json", function(error, root) {
    if (error) throw error;

    var focus = root,
    nodes = pack.nodes(root),
    view;

    var circle = svg.selectAll("circle")
        .data(nodes)
        .enter().append("circle")
        .attr("class", function(d) { return d.parent ? d.children ? "node" : "node node--leaf" : "node node--root"; })
        .style("fill", function(d) { return d.children ? color(d.depth) : null; })
        .on("click", function(d) { if (focus !== d) zoom(d), d3.event.stopPropagation(); });

    var text = svg.selectAll("text")
        .data(nodes)
        .enter().append("text")
        .attr("class", "label")
        .style("fill", "black")
        .style("display", function(d) { return d.parent === root ? null : "none"; })
        .text(function(d) { return d.name; });

    var node = svg.selectAll("circle,text");

    d3.select("body")
        .data(nodes)
        .style("background", color(-1))

    zoomTo([root.x, root.y, root.r * 2 + margin]);

    function zoom(d) {
        var focus0 = focus; focus = d;

        var transition = d3.transition()
            .duration(d3.event.altKey ? 7500 : 750)
            .tween("zoom", function(d) {
                var i = d3.interpolateZoom(view, [focus.x, focus.y, focus.r * 2 + margin]);
                return function(t) { zoomTo(i(t)); };
            } );

        transition.selectAll("text")
            .filter(function(d) { return d.parent === focus || this.style.display === "inline"; })
            .style("fill", "darkslategrey")
            .each("start", function(d) { if (d.parent === focus) this.style.display = "inline"; })
            .each("end", function(d) { if (d.parent !== focus) this.style.display = "none"; });
    }

    function zoomTo(v) {
        var k = diameter / v[2]; view = v;
        node.attr("transform", function(d) { return "translate(" + (d.x - v[0]) * k + "," + (d.y - v[1]) * k + ")"; });
        circle.attr("r", function(d) { return d.r * k; });
    }
}); 
d3.select(self.frameElement).style("height", diameter + "px");

目前,如果点击node--leaf,它只会缩小。但我想提醒那个存储在该节点的JSON中的URL。

JSON看起来像这样:

{
    "name": "Packages",
    "children": [
        {
            "name": "Talks",
            "children": [
                {
                    "name": "talk_1",
                    "size": 722,
                    "url": "www.example_1.com"
                },
                {
                    "name": "talk_2",
                    "size": 722,
                    "url": "www.example_2.com"
                },
                {
                    "name": "talk_3",
                    "size": 722,
                    "url": "www.example_3.com"
                }
            ]
        }
    ]
}

因此,如果我点击talk_3节点,我应该访问www.example_3.com来获取d.url

2 个答案:

答案 0 :(得分:1)

您可以访问点击功能中的网址,如下所示:

D_A_y

在点击功能中,这将打开新标签中的网址:

var circle = svg.selectAll("circle")
            .data(nodes)
            .enter().append("circle")
            .attr("class", function (d) {
            return d.parent ? d.children ? "node" : "node node--leaf" : "node node--root";
        })
            .style("fill", function (d) {
            return d.children ? color(d.depth) : null;
        })
            .on("click", function (d) {
              var win = window.open(d.url, '_blank');
              win.focus();
             console.log(d.url);
            if (focus !== d) zoom(d), d3.event.stopPropagation();
        });

答案 1 :(得分:0)

如果你想“警告”你可以通过使用警报功能onClick事件来做到这一点,如下面的代码所示。查看this plnkr了解工作演示。

d3.json("data.json", function(error, root) {
        if (error) throw error;

        var focus = root,
        nodes = pack.nodes(root),
        view;

        var circle = svg.selectAll("circle")
        .data(nodes)
        .enter().append("circle")
        .attr("class", function(d) { return d.parent ? d.children ? "node" : "node node--leaf" : "node node--root"; })
        .style("fill", function(d) { return d.children ? color(d.depth) : null; })
        .on("click" , function(d) {

            console.log(d.url);
            alert(d.url);
            return d;
        })