更新:以下を編集
onclick
あなたの問題を解決する最善の方法は、その人の配偶者を(入れ子になったグループではなく)その人と同じグループに保つことであるという点で、あなたは正しいと思います。onclick
それに加えて、間違った場所に適用していると思います。私のアドバイスは
行 325 ~ 330 を次のように変更します。
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);
現在、個人とその配偶者の両方onclick
を含むグループに を適用していましたが、代わりに各個人/配偶者に個別にを使用したいと考えています。この変更を行ったら、コードを更新して、(ノードの group ではなく)各ノードが選択されているかどうかをテストする必要があることに注意してください (355 ~ 365 行目)。また、CSS ファイルの 25 行目と 29 行目のスタイルとCSS を更新する必要があります。onclick
rect
g
.node rect.normal
.node rect.selected
2 番目の問題は、各人の最初の配偶者だけを描いていることです。現在、このupdateSpouses
関数は各人に対して反復処理を行っており、最初の配偶者だけの長方形を含むグループを追加しています。あなたがする必要があるのは、最初に配偶者を持つ各人にグループを追加し、次に各人の配偶者にグループを追加することです。updateSpouses
開始するための変更方法の大まかなドラフトを次に示します。
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);
編集
あなたのコメントに応えて、元のコードhttp://jsfiddle.net/mdml/xJBXm/を修正しました。私が行った変更の簡単な要約は次のとおりです。
- 各人をグループに入れ、グループには独自の
onclick
属性 (行 141 ~ 146) を設定して、四角形/テキストをクリックするclickedNode
と呼び出されるようにします。
- また、配偶者の各セットをグループに入れ (上記のように)、それぞれが個別にクリックできるようにします (229 ~ 232 行目)。
resetNodePersonSelected
関数と関数を変更してsetNodePersonSelected
、子供に加えて配偶者を検索/更新するようにしました。
上記の変更点について大まかに説明しましたが、実装に関して他に質問がある場合はお知らせください。