2014-12-16 20 views
6

OK ... Tôi đang sử dụng Bao bì vòng kết nối có thể thu phóng từ http://bl.ocks.org/mbostock/7607535 Tôi đã mở tệp flare.json và bắt đầu lộn xộn với nó và có thể thao tác thành công. Nó trông giống như thế này:d3js Đặt vòng tròn cuối cùng thành siêu liên kết

flare.json

{ 
    "name": "flare", 
"children": [ 
{ 
"name": "Kommunikation und Umwelt", 
"children": [ 

{ 
"name": "Courses", 
"children": [ 
    { 
    "name": "AO-Psy.", 
    "children": [ 
    {"name": "Prof. A", "size": 5731,"url":"google.com"}, 
    {"name": "Prof. B", "size": 5731}, 
    {"name": "Prof. C", "size": 5731} 
    ] 
    }, 
    { 
    "name": "E&E", 
    "children": [ 
    {"name": "Prof. D", "size": 5731}, 
    {"name": "Prof. E", "size": 5731}, 
    {"name": "Prof. F", "size": 5731}, 
    {"name": "Prof. G", "size": 5731}, 
    {"name": "Prof. H", "size": 5731} 
    ] 
    }, 
    { 
    "name": "IBSS", 
    "children": [ 
    {"name": "Prof. I", "size": 5731}, 
    {"name": "Prof. J", "size": 5731}, 
    {"name": "Prof. K", "size": 5731} 
    ] 
    }, 
    {"name": "", "size": 0}, 
    { 
    "name": "E-Gov", 
    "children": [ 
    {"name": "Prof. L", "size": 5731}, 
    {"name": "Prof. M", "size": 5731}, 
    {"name": "Prof. N", "size": 5731} 
    ] 
    }, 
    { 
    "name": "Muki", 
    "children": [ 
    {"name": "Prof. O", "size": 5731}, 
    {"name": "Prof. P", "size": 5731}, 
    {"name": "Prof. Q", "size": 5731}, 
    {"name": "Prof. V", "size": 5731} 
    ] 
    }, 
    {"name": "Schedule", "size": 5731}, 
    {"name": "News", "size": 5731}, 
    {"name": "Events", "size": 5731}, 
    {"name": "Search", "size": 5731}, 
    {"name": "", "size": 0} 
] 
}, 
{"name": "", "size": 0} 
] 

},

Những gì tôi muốn làm bây giờ, là để cố gắng thêm các siêu liên kết. Ví dụ, tôi muốn có thể bấm vào "ProfA" và đi đến một trang html khác tôi sẽ tạo. Có một sửa đổi tôi có thể thực hiện để flare.json sẽ làm điều đó?

tôi đã tìm thấy một số bài viết Post1Post2Post3
nhưng không được làm việc nó chỉ thu nhỏ lại

đầy đủ tại đây tập tin html, flare.json đã được đăng ở đây (phần ngắn)
zoom.html:

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

.node { 
cursor: pointer; 
} 

.node:hover { 
stroke: #000; 
stroke-width: 1.5px; 
} 

.node--leaf { 
fill: #14DCD2; 
} 

.label { 
font: 20px "Helvetica Neue", Helvetica, Arial, sans-serif; 
text-anchor: middle; 
text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff; 
} 

.label, 
.node--root, 
.node--leaf { 
pointer-events: none; 
} 

</style> 
<body> 
<script src="http://d3js.org/d3.v3.min.js"></script> 
<script> 


var margin = 600, 
diameter = 1920; 

var color = d3.scale.linear() 
.domain([-1, 5]) 
.range(["hsl(152,80%,80%)", "hsl(228,30%,40%)"]) 
.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("flare.json", function(error, root) { 
if (error) return console.error(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-opacity", function(d) { return d.parent === root ? 1 : 0; }) 
    .style("display", function(d) { return d.parent === root ? null : "none"; }) 
    .text(function(d) { return d.name; }) 
    //.on('click', function(d, i) {window.location.href = d.url;}); 

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

    node.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("dx", 8) 
      .attr("dy", 3) 
      .attr("text-anchor", "start") 
      .text(function(d) { return d.name; }) 
      ; 
    } else { 
    thisNode.append("text") 
     .attr("dx", -8) 
     .attr("dy", 3) 
     .attr("text-anchor", "end") 
     .text(function(d) { return d.name; });  
    } 

    }); 




    d3.select("body") 
    .style("background", color(-1)) 
    .on("dblclick", function() { zoom(root); }); 

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

    function zoom(d) { 
    var focus0 = focus; focus = d; 
    //.attr("xlink:href", url); 
    //.on('click', function(d, i) {window.location.href = d.url;}); 

    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 * 4 + margin]); 
     return function(t) { zoomTo(i(t)); }; 
    }); 

    transition.selectAll("text") 
    .filter(function(d) { return d.parent === focus || this.style.display === "inline"; }) 
    .style("fill-opacity", function(d) { return d.parent === focus ? 1 : 0; }) 
    .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"); 

    </script> 
    </html> 

Trả lời

6

Sự cố trong quá trình thiết lập của bạn chủ yếu xuất phát từ thực tế là bạn có pointer-events: none cho các yếu tố nhất định, chẳng hạn như lá (vòng tròn nhỏ nhất).

Nếu bạn sửa và xác định sự kiện click sao cho nó hướng đến url thay vì kích hoạt sự kiện thu phóng cho lá, bạn sẽ có được hành vi mong muốn.

Tôi đặt cùng một fiddle nhỏ cho bạn, xem tại đây: http://jsfiddle.net/chroth/fkxcvtu9/3/

Cốt lõi của ý tưởng là ở đây (click chức năng):

function clickFct(d,i) { 
if (d3.select(this).classed("node--leaf")) { 
    alert(d.url); //open URL here 
} else { 
    if (focus !== d) 
    { 
     zoom(d); 
     d3.event.stopPropagation(); 
    } 
} 
} 

và trong sự thay đổi này theo phong cách:

.node--root, 
.node--leaf { 
    pointer-events: all; 
} 

Todos

Như bạn thấy, hiện tại tôi chỉ đang chụp alert. Ngoài ra, bạn có thể muốn vô hiệu hóa các sự kiện nhấp chuột nhất định khi không được phóng to, v.v. Cộng tác với màu sắc.

Ngoài ra, lưu ý rằng bạn cần phải sửa chữa sự hiện diện của các nhãn, vv

Nhưng tôi lại đó cho bạn :)

Hy vọng rằng sẽ giúp.

+1

Omg đang hoạt động Tôi rất hạnh phúc ngay bây giờ bạn đã lưu tôi cảm ơn bạn rất nhiều –

+0

bạn được chào đón! xin lưu ý rằng câu trả lời của tôi chỉ là sự khởi đầu - hãy xem todos! chúc may mắn! –

+0

vâng tôi sẽ tiếp tục làm việc trên đó. Có thể hỏi thêm câu hỏi nếu tôi không thực hiện bất kỳ tiến bộ nào không? –

1

Cảm ơn Pinguin. Nó hoạt động đúng với tôi, nhưng tôi không chắc chắn về mục đích của tham số i trong hàm của bạn. Đây là một sửa đổi nhỏ bảo vệ chống lại các url không xác định.

function onClickLeaf(d) 
{ 
    if (d3.select(this).classed("node--leaf")) 
    { 
     if(d.url !== undefined) 
     { 
      alert(d.url); //open URL here 
     } 
    } 
    else 
    { 
     if (focus !== d) 
     { 
      zoom(d); 
      d3.event.stopPropagation(); 
     } 
    } 
} 

Bỏ phiếu từ tôi do dòng mã cụ thể này, và đủ đẹp để đưa nó vào chức năng đơn giản.

if (d3.select(this).classed("node--leaf")) 
Các vấn đề liên quan