我有一个强制导向图,我想在鼠标上更改节点中的文本.我试图通过在数据数组中放置“full_name”数据然后在鼠标悬停时调用它,就像我调用它来获取蓝色矩形图像一样.但它似乎不起作用,我没有得到任何错误.所以我不知道是什么问题..
您可以在此处查看和编辑示例:http://jsfiddle.net/dzorz/CqaLh/
和脚本看起来像这样:
var data = {"nodes":[ {"name":"Action 1","type":2,"slug": "","entity":"employee" },{"name":"Action 2","type":3,{"name":"Action 4","type":5,"value":265000,"entity":"employee"},{"name":"Action 5","type":6,"value":23000,{"name":"Action 3","type":4,"value":115000,{"name":"YHO","full_name":"Yahoo","type":1,"slug": "www.yahoo.com","entity":"company","img_hrefD":"http://img4host.net/upload/30143226522090da3be7a.jpg","img_hrefL":"http://img4host.net/upload/30145118522095467b7e3.jpg"},{"name":"GGL","full_name":"Google","slug": "www.google.com","img_hrefL":"http://img4host.net/upload/30145118522095467b7e3.jpg" },{"name":"BNG","full_name":"Bing","slug": "www.bing.com",{"name":"YDX","full_name":"Yandex","img_hrefL":"http://img4host.net/upload/30145118522095467b7e3.jpg" } ],"links":[ {"source":0,"target":3,"value":10},{"source":4,"value":1},{"source":1,"target":7,{"source":2,"target":4,"target":5,"target":6,{"source":8,"value":1} ] } var w = 560,h = 500,radius = d3.scale.log().domain([0,312000]).range(["10","50"]); var vis = d3.select("body").append("svg:svg") .attr("width",w) .attr("height",h); vis.append("defs").append("marker") .attr("id","arrowhead") .attr("refX",25 + 3) /*must be smarter way to calculate shift*/ .attr("refY",2) .attr("markerWidth",6) .attr("markerHeight",4) .attr("orient","auto") .append("path") .attr("d","M 0,0 V 4 L6,2 Z"); //this is actual shape for arrowhead //d3.json(data,function(json) { var force = self.force = d3.layout.force() .nodes(data.nodes) .links(data.links) .distance(150) .charge(-1000) .size([w,h]) .start(); var link = vis.selectAll("line.link") .data(data.links) .enter().append("svg:line") .attr("class",function (d) { return "link" + d.value +""; }) .attr("x1",function(d) { return d.source.x; }) .attr("y1",function(d) { return d.source.y; }) .attr("x2",function(d) { return d.target.x; }) .attr("y2",function(d) { return d.target.y; }) .attr("marker-end",function(d) { if (d.value == 1) {return "url(#arrowhead)"} else { return " " } ;}); function openLink() { return function(d) { var url = ""; if(d.slug != "") { url = d.slug } //else if(d.type == 2) { //url = "clients/" + d.slug //} else if(d.type == 3) { //url = "agencies/" + d.slug //} window.open("//"+url) } } var node = vis.selectAll("g.node") .data(data.nodes) .enter().append("svg:g") .attr("class","node") .call(force.drag); node.append("circle") .attr("class",function(d){ return "node type"+d.type}) .attr("r",function(d) { return radius(d.value) || 10 }) //.style("fill",function(d) { return fill(d.type); }) node.append("svg:image") .attr("class",function(d){ return "circle img_"+d.name }) .attr("xlink:href",function(d){ return d.img_hrefD}) .attr("x","-36px") .attr("y","-36px") .attr("width","70px") .attr("height","70px") .on("click",openLink()) .on("mouSEOver",function (d) { if(d.entity == "company") { d3.select(this).attr("width","90px") .attr("x","-46px") .attr("y","-36.5px") .attr("xlink:href",function(d){ return d.img_hrefL}); } }) .on("mouSEOut",function (d) { if(d.entity == "company") { d3.select(this).attr("width","70px") .attr("x","-36px") .attr("y","-36px") .attr("xlink:href",function(d){ return d.img_hrefD}); } }); node.append("svg:text") .attr("class",function(d){ return "nodetext title_"+d.name }) .attr("dx",0) .attr("dy",".35em") .attr("text-anchor","middle") .style("fill","white") .text(function(d) { return d.name }) .on("mouSEOver",function (d) { if(d.entity == "company"){ d3.select(this).text(function(d) { return d.full_name }) } }); force.on("tick",function() { link.attr("x1",function(d) { return d.source.x; }) .attr("y1",function(d) { return d.source.y; }) .attr("x2",function(d) { return d.target.x; }) .attr("y2",function(d) { return d.target.y; }); node.attr("transform",function(d) { return "translate(" + d.x + "," + d.y + ")"; }); }); //});
CSS:
@charset "utf-8"; /* CSS Document */ .link10 { stroke: #ccc; stroke-width: 3px; stroke-dasharray: 3,3; } .link1 { stroke: #000; stroke-width: 3px;} .nodetext { pointer-events: none; font: 14px sans-serif; font-weight:bold;} .node.type1 { fill:brown; } .node.type2 { fill:#337147; } .node.type3 { fill:blue; } .node.type4 { fill:red; } .node.type5 { fill:#1BC9E0; } .node.type6 { fill:#E01B98; } image.circle { cursor:pointer; } .fadein{ display:none; font-size:20px; } .rectD{ background-color:#000000; width:70px; height:30px } .rectL{ background-color:#000000; width:90px; height:30px }
甚至可以在加载所有内容后更改文本?
请帮忙
解决方法
每个节点都有一个图像和一个与之关联的文本元素.图像和文本元素的鼠标悬停事件彼此干扰,因为它们占据相同的空间.
我分叉了你的jsfiddle并为节点创建了一个鼠标悬停监听器并将两个事件放在同一个函数中:
node.on("mouSEOver",function (d) { d3.select(this).select('text') .text(function(d){ return d.full_name; }) if (d.entity == "company") { d3.select(this).select('image') .attr("width","90px") .attr("x","-46px") .attr("y","-36.5px") .attr("xlink:href",function (d) { return d.img_hrefL }); } });
(节点上有一个类似的监听器,用于鼠标输出以反转这些变化).