2015-01-14 15 views
3

我有一个小问题就在这里:如何实现这一泡沫是唯一可点击,如果完全地放大d3js

我用这个例子(http://bl.ocks.org/mbostock/7607535)工作,我修改这样的 flare.json文件:

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

{ 
"name": "Courses", 
"children": [ 
    { 
    "name": "AO-Psy.", 
    "children": [ 
    {"name": "Prof. A", "size": 5731,"url":"index.html"}, 
    {"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} 
] 
}, 

如果我点击Prof.A,我会得到我的下一个html页面。 我的问题是,即使我没有放大这个泡泡,我也可以点击Prof.A。我只想在点击它时点击它,并且标签是可读的。

我试图“修复”缩放功能,但似乎没有任何工作。

zoom.html:

<!DOCTYPE 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 { 
pointer-events: none; 
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: all; 
} 
.node--leaf:hover { 
fill: orangered; 
} 

</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", clickFct) 

    function clickFct(d,i) { 
    if (d3.select(this).classed("node--leaf")) { 
    window.open(d.url,"_self"); //open URL here 
    } else { 
    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> 

我不能取得任何进展似乎没有任何工作,请帮助我!

+0

你碰巧有一个jsfiddle吗? –

+0

@PinguinDirk是在这里 http://jsfiddle.net/chroth/fkxcvtu9/3/ –

回答

2

让我扩大@利亚的回答有点:

首先,我会从CSS中删除以下位:

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

,以获得在指针事件的更多控制。

接下来,我们添加一些额外的类节点,这样我们就可以访问这些比较容易:

.attr("class", function(d) { return 'depth' + d.depth + ' ' + 
    (d.parent ? d.children ? "node" : "node node--leaf" : "node node--root"); }) 

因此,每个节点有一些额外的类,如.depth4

现在我们可以直接与节点交谈,并根据需要添加/删除指针事件。

对于这一点,和方便,我们添加了新的功能:

function adjustPointerEvents(depth) { 
    d3.selectAll('.node').attr('pointer-events', 'none'); 
    d3.select('.node--root').attr('pointer-events', 'all'); 
    d3.selectAll('.depth' + (depth + 1)).attr('pointer-events', 'all'); 
} 

(首先我们删除所有事件,然后我们将事件添加到节点根回(要能缩小),然后我们添加的“下一个”级的事件))

在初始化,我们称之为2级:

adjustPointerEvents(2); 

顺便说一句:你有某种形式的附加层的存在(” Kommunikation und Umwelt'和那么“课程”),我离开了微调给你...

,我们必须确保我们称之为上click

function clickFct(d,i) { 
    adjustPointerEvents(d.depth); 
    ... 

而且我们所有的设置。

下面是更新后的jsfiddle:Fiddle

如上所述,仍然需要进行一些微调,但我希望我提供一些更多的指针。

+0

你是我的英雄现在我开始以良好的调教感谢很多 –

+0

我很高兴它适合你!祝你好运 :) –

1

您可以根据缩放级别动态更改节点的指针事件样式。因此,在您.enter()创建节点时设置.style("pointer-events", "none"),然后当该节点被放大,像

d3.select("some css for identifying the node") 
.style("pointer-events", "auto") 

取决于你如何做放大,这将需要进行调整(例如,如果点击节点先放大它,然后点击节点打开页面,在这种情况下,你需要改变.on("click")的行为。如果你想避免内联样式(你应该),你可以有你的节点的基类有pointer-events: none一类clickable其中有pointer-events: auto,你可以在你的缩放功能中使用d3.classed("clickable", true)使点击行为可用

+0

这似乎没有工作,现在没有什么是可点击的,我现在不能放大,也许我做错了 –

+0

你可以给我一个例子在哪里改变寄托都? –

+0

好吧,我猜你不会回答我 –