2014-11-22 98 views
2

我無法超鏈接Reingold-Tifold樹形圖中的子元素。該圖建立在D3中,基於Mike Bostock使用的一個示例:http://bl.ocks.org/mbostock/4339184D3:樹形圖中的超鏈接

我的代碼和我的JSON文件的一部分如下。

在這一點上,圖表工作正常 - 如果我點擊父節點,它展開顯示一系列包含在我的JSON文件中的子節點。但是,當我到達兒童級別時,我想讓這個詞超鏈接。我不明白該怎麼做。

我以前使用過一個SO問題/答案 - Hyperlinks in d3.js objects - 瞭解如何向我的JSON數據添加URL(此時所有內容都只是鏈接到Google.co.uk)。但我不明白如何將該URL鏈接到我的樹形圖,以便子節點變爲超鏈接。

你能讓我知道我該怎麼做?

非常感謝您的幫助。 (和感謝,@ IH8,爲您的幫助至今。)

馬特

<html xmlns:xlink="http://www.w3.org/1999/xlink"> 
<head><meta charset="utf-8"> 
<style> 

.node { 
    cursor: pointer; 
} 

.node circle { 
    fill: #FF0000; 
    stroke: black; 
    stroke-width: 1.5px; 
} 

.node text { 
    font: 11px sans-serif; 
} 

.link { 
    fill: none; 
    stroke: #FF0000; 

    stroke-width: 1.5px; 
} 

</style> 
<style id="style-1-cropbar-clipper">/* Copyright 2014 Evernote Corporation. All rights reserved. */ 
.en-markup-crop-options { 
    top: 18px !important; 
    left: 50% !important; 
    margin-left: -100px !important; 
    width: 200px !important; 
    border: 2px rgba(255,255,255,.38) solid !important; 
    border-radius: 4px !important; 
} 

.en-markup-crop-options div div:first-of-type { 
    margin-left: 0px !important; 
} 
</style></head><body> 
<script src="http://d3js.org/d3.v3.min.js"></script> 
<script> 

var margin = {top: 20, right: 120, bottom: 20, left: 120}, 
    width = 960 - margin.right - margin.left, 
    height = 800 - margin.top - margin.bottom; 

var i = 0, 
    duration = 750, 
    root; 

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

var diagonal = d3.svg.diagonal() 
    .projection(function(d) { return [d.y, d.x]; }); 

var svg = d3.select("body").append("svg") 
    .attr("width", width + margin.right + margin.left) 
    .attr("height", height + margin.top + margin.bottom) 
    .append("g") 
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 

d3.json("/sites/default/files/tcs/D3/data/turbo.json", function(error, turbo) { 
    root = turbo; 
    root.x0 = height/2; 
    root.y0 = 0; 

    function collapse(d) { 
    if (d.children) { 
     d._children = d.children; 
     d._children.forEach(collapse); 
     d.children = null; 
    } 
    } 

    root.children.forEach(collapse); 
    update(root); 
}); 

d3.select(self.frameElement).style("height", "800px"); 

function update(source) { 

    // Compute the new tree layout. 
    var nodes = tree.nodes(root).reverse(), 
     links = tree.links(nodes); 

    // Normalize for fixed-depth. 
    nodes.forEach(function(d) { d.y = d.depth * 180; }); 

    // Update the nodes… 
    var node = svg.selectAll("g.node") 
     .data(nodes, function(d) { return d.id || (d.id = ++i); }); 

    // Enter any new nodes at the parent's previous position. 
    var nodeEnter = node.enter().append("g") 
     .attr("class", "node") 
     .attr("transform", function(d) { return "translate(" + source.y0 + "," + source.x0 + ")"; }) 
     .on("click", click); 

    nodeEnter.append("circle") 
     .attr("r", 1e-6) 
     .style("fill", function(d) { return d._children ? "red" : "#fff"; }); 


    nodeEnter.each(function(d){ 
    var thisNode = d3.select(this); 
    if (!d.children) { 
     thisNode.append("a") 
      .attr("xlink:href", function(d) { return d.url; }) 
      .append("text") 
       .attr("x", 8) 
       .attr("dy", 3) 
       .attr("text-anchor", "start") 
       .text(function(d) { return d.name; }); 
    } else { 
     thisNode.append("text") 
      .attr("x", -8) 
      .attr("dy", 3) 
      .attr("text-anchor", "end") 
      .text(function(d) { return d.name; });  
    } 
}); 


    // Transition nodes to their new position. 
    var nodeUpdate = node.transition() 
     .duration(duration) 
     .attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; }); 

    nodeUpdate.select("circle") 
     .attr("r", 4.5) 
     .style("fill", function(d) { return d._children ? "red" : "#fff"; }); 

    nodeUpdate.select("text") 
     .style("fill-opacity", 1); 

    // Transition exiting nodes to the parent's new position. 
    var nodeExit = node.exit().transition() 
     .duration(duration) 
     .attr("transform", function(d) { return "translate(" + source.y + "," + source.x + ")"; }) 
     .remove(); 

    nodeExit.select("circle") 
     .attr("r", 1e-6); 

    nodeExit.select("text") 
     .style("fill-opacity", 1e-6); 

    // Update the links… 
    var link = svg.selectAll("path.link") 
     .data(links, function(d) { return d.target.id; }); 

    // Enter any new links at the parent's previous position. 
    link.enter().insert("path", "g") 
     .attr("class", "link") 
     .attr("d", function(d) { 
     var o = {x: source.x0, y: source.y0}; 
     return diagonal({source: o, target: o}); 
     }); 

    // Transition links to their new position. 
    link.transition() 
     .duration(duration) 
     .attr("d", diagonal); 

    // Transition exiting nodes to the parent's new position. 
    link.exit().transition() 
     .duration(duration) 
     .attr("d", function(d) { 
     var o = {x: source.x, y: source.y}; 
     return diagonal({source: o, target: o}); 
     }) 
     .remove(); 

    // Stash the old positions for transition. 
    nodes.forEach(function(d) { 
    d.x0 = d.x; 
    d.y0 = d.y; 
    }); 
} 

// Toggle children on click. 
function click(d) { 
    if (d.children) { 
    d._children = d.children; 
    d.children = null; 
    } else { 
    d.children = d._children; 
    d._children = null; 
    } 
    update(d); 
} 

</script> 
</body> 
</html> 

我的JSON文件的一部分:你創建的時候做了一個小錯誤

{ 
"name": "turbo", 


"children": [ 
    { 

    "name": "Level 1", 
    "children": [ 

    { 
    "name": "Google", 
    "children": [ 
     {"name": "Website", "size": 3938, "URL":"http://www.google.co.uk"}, 
     {"name": "CommunityStructure", "size": 3812, "URL":"http://www.google.co.uk"}, 
     {"name": "HierarchicalCluster", "size": 6714, "URL":"http://www.google.co.uk"}, 
     {"name": "MergeEdge", "size": 743, "URL":"http://www.google.co.uk"} 
    ] 
    }, 

    { 
    "name": "graph", 
    "children": [ 
     {"name": "BetweennessCentrality", "size": 3534, "URL":"http://www.google.co.uk"}, 
     {"name": "LinkDistance", "size": 5731, "URL":"http://www.google.co.uk"}, 
     {"name": "MaxFlowMinCut", "size": 7840, "URL":"http://www.google.co.uk"}, 
     {"name": "ShortestPaths", "size": 5914, "URL":"http://www.google.co.uk"}, 
     {"name": "SpanningTree", "size": 3416, "URL":"http://www.google.co.uk"} 
    ] 
    }, 
    { 
    "name": "optimization", 
    "children": [ 
     {"name": "AspectRatioBanker", "size": 7074, "URL":"http://www.google.co.uk"} 
    ] 
    } 
    ] 
    }, 
. . . 

回答

4

似乎你的數據集的url屬性,或者你應該調整你使用的代碼來將xlink:href屬性添加到a元素。你打電話:

.attr("xlink:href", function(d) { return d.url; }) 

但在數據集中的屬性定義如下:

"URL": "http://www.google.co.uk" 

那些不匹配,你應該將代碼改成這樣:

.attr("xlink:href", function(d) { return d.URL; }) 

或者你的數據集爲:

"url": "http://www.google.co.uk" 

請記住,JSON屬性的名稱區分大小寫。

+0

這是一個巨大的幫助。現在正在工作。謝謝! – scaffolding 2014-11-22 21:19:47