2014-12-16 11 views
6

ठीक है ... मैं http://bl.ocks.org/mbostock/7607535 से ज़ूम करने योग्य सर्किल पैकिंग का उपयोग कर रहा हूं। मैंने flare.json फ़ाइल खोली और इसके साथ गड़बड़ करना शुरू कर दिया और इसे सफलतापूर्वक कुशल बनाने में सक्षम था। यह इस तरह दिखता है:d3js अंतिम सर्कल बनाना एक हाइपरलिंक

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} 
] 

},

क्या मैं अब क्या करना चाहते हैं, हाइपरलिंक जोड़ने का प्रयास करते है। उदाहरण के लिए, मैं "प्रोफेसर" पर क्लिक करने में सक्षम होना चाहता हूं और एक अन्य HTML पृष्ठ पर जाउंगा जो मैं बनाउंगा। क्या कोई संशोधन है जो मैं flare.json को कर सकता हूं जो ऐसा करेगा?

मैं पहले से ही कुछ पदों Post1Post2Post3
पाया, लेकिन कुछ भी नहीं है यह सिर्फ बाहर ज़ूम फिर

यहाँ

पूरा html फ़ाइल, flare.json पहले से ही यहाँ पोस्ट किया जाता है (कम हिस्सा)
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> 

उत्तर

6

समस्या अपने सेटअप में ज्यादातर तथ्य से उपजा है कि आप इस तरह के पत्ते (छोटी हलकों) के रूप में कुछ तत्वों के लिए pointer-events: none है।

यदि आप इसे सही करते हैं और click ईवेंट को परिभाषित करते हैं जैसे कि यह पत्तियों के लिए ज़ूम ईवेंट ट्रिगर करने के बजाय यूआरएल को निर्देशित करता है, तो आपको वांछित व्यवहार मिलता है।

मैं एक साथ आप के लिए एक छोटा सा बेला में कहें, यहाँ देखें: http://jsfiddle.net/chroth/fkxcvtu9/3/

विचार के मूल में यहाँ (click समारोह) है:

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(); 
    } 
} 
} 

और शैली में इस परिवर्तन में:

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

Todos

जैसा कि आप देख सकते हैं, वर्तमान में मैं सिर्फ alert शूटिंग कर रहा हूं। साथ ही, आप ज़ूम इन नहीं होने पर कुछ क्लिक ईवेंट अक्षम करना चाहेंगे। साथ ही रंगों पर भी काम करें।

इसके अलावा, यह है कि आप लेबल आदि

की दृश्यता को ठीक करने की जरूरत है ध्यान दें लेकिन मुझे लगता है कि आप के लिए :)

आशा है कि मदद करता है छोड़ दें।

+1

इसके कामकाजी ओमजी मैं अभी बहुत खुश हूं कि आपने मुझे बचाया आदमी आपको बहुत धन्यवाद –

+0

आपका स्वागत है! कृपया ध्यान रखें कि मेरा जवाब सिर्फ शुरुआत है - टोडोस देखें! सौभाग्य! –

+0

हाँ मैं इस पर काम करना जारी रखूंगा। अगर मैं कोई प्रगति नहीं करता तो क्या अधिक सवाल पूछना ठीक है? –

1

धन्यवाद पिंगुइन। यह मेरे लिए सही तरीके से काम कर रहा है, लेकिन मुझे आपके फ़ंक्शन में i पैरामीटर के उद्देश्य के बारे में निश्चित नहीं है। यहां एक छोटा संशोधन है जो अपर्याप्त यूआरएल के खिलाफ सुरक्षा करता है।

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(); 
     } 
    } 
} 
मुझ से वोट ऊपर कोड के इस विशेष लाइन की वजह से

, और काफी अच्छा सादगी के लिए एक समारोह में यह रैप करने के लिए किया जा रहा है।

if (d3.select(this).classed("node--leaf")) 
संबंधित मुद्दे