d3.js - d3js - javascript tree diagram
d3.js Family Tree Spouse Destacado (1)
Actualizado: Editar a continuación
Creo que tiene razón en que la mejor manera de resolver su problema de onclick
es mantener a los cónyuges de una persona en el mismo grupo que la persona (en lugar de en un grupo anidado). Además de eso, creo que estás aplicando el onclick
en el lugar equivocado. Mi consejo es
Cambie las líneas 325-330 a la siguiente
var node = g.append("svg:g").attr("class", "node") .selectAll("g") .data(function (d) { return d.nodes; }) .enter().append("svg:g"); node.append("svg:rect") .on("click", clickedNode);
Actualmente, usted estaba aplicando el
onclick
en el grupo que contiene tanto a la persona como a sus cónyuges, mientras que en su lugar desea utilizar elonclick
en cada persona / cónyuge por separado. Tenga en cuenta que una vez que realice este cambio, tendrá que actualizar su código para probar elrect
cada nodo (en lugar del grupog
del nodo) en cuanto a si está seleccionado (líneas 355-365). También deberá actualizar su CSS al estilo.node rect.normal
y.node rect.selected
en las líneas 25 y 29 de su archivo CSS.El segundo problema es que solo está dibujando el primer cónyuge para cada persona. Actualmente, la función
updateSpouses
itera sobre cada persona y luego agrega un grupo con un rectángulo solo para el primer cónyuge. Lo que debe hacer es agregar primero un grupo para cada persona con sus cónyuges, y luego sobre los cónyuges de cada persona. Aquí hay un borrador de cómo modificar losupdateSpouses
para que pueda comenzar:var node = svgTree.selectAll(".node g") .append("svg:g").attr("transform", function (d, i) { if (i == d3.familyTree.rootGeneration) return "translate(" + (d.spouseX) + "," + (d3.familyTree.gapBetweenSpouses) + ")"; else return "translate(" + 0 + "," + (d3.familyTree.gapBetweenSpouses) + ")"; }) .filter(function (d, i) { return personSpouses" in d }); var spouses = node.selectAll(".spouse") .data(function(d){ return d.personSpouses }).enter() .append("rect") .on("click", clickedNode);
Editar
En respuesta a su comentario, continué y modifiqué su código original http://jsfiddle.net/mdml/xJBXm/ . Aquí hay un resumen rápido de los cambios que hice:
- Puse a cada persona en un grupo, que luego tiene su propio atributo
onclick
(líneas 141-146), de modo que al hacer clic en el rectángulo / texto se hace clic enclickedNode
. - También puse cada grupo de cónyuges en un grupo (como se describe arriba) para que cada uno de ellos también pueda hacer clic individualmente (líneas 229-232).
-
setNodePersonSelected
funcionesresetNodePersonSelected
ysetNodePersonSelected
para que busquen / actualicen los cónyuges además de losresetNodePersonSelected
.
Describí los cambios en el nivel superior anterior, pero avíseme si tiene más preguntas sobre la implementación.
Enlace de código: http://jsfiddle.net/mj58659094/yKUsQ/ ;
Cuando se hace clic en una persona (nodo), también selecciona al cónyuge. Solo quiero seleccionar (resaltar) a la persona que hice clic (esposo o esposa o hijo). (Cuando inspecciono el html en FireBug, los nodos del cónyuge (g transform = "translate (0,70)") están dentro de los nodos persona. Creo que deberían estar afuera, pero dentro de g class = "node" group). No sé cómo arreglar esto. Alguien, por favor ayuda. Gracias.