2013-10-07 1 views
2

코드 링크 : http://jsfiddle.net/mj58659094/yKUsQ/;d3.js 패밀리 트리 배우자 강조

사람 (노드)를 클릭

enter image description here

, 그것은 또한 배우자를 선택합니다. 클릭 한 사람 (남편 또는 아내 또는 자녀) 만 선택 (강조 표시)하고 싶습니다. (Firebug에서 html을 검사 할 때 배우자 노드 (g transform = "translate (0,70)")는 사람 노드 안에 있습니다. 외부에 있어야하지만 g 클래스 = "노드"그룹 내에 있어야한다고 생각합니다. 이 문제를 해결하는 방법을 모르겠습니다. 누구든지 도와주세요. 감사.

+0

나는 배우자를 추가하는 방법에 문제가 있다고 생각합니다. 지금,'personSpouses'는 명단 일 수 있지만, 당신의 나무에 아무도 한 명 이상의 배우자가 없습니다. 나는 한 명 이상의 배우자를 당신의 바이올린에 넣으려고 애썼지 만 그녀는 그려지지 않았습니다. 사람들이 여러 배우자를 가질 수 있기를 원한다면 먼저 그 문제를 해결할 것입니다. 왜냐하면 그 후에 'onclick'문제를 해결하는 것이 간단 할 것이기 때문입니다. – mdml

+0

@ mtitan8 빠른 응답을 보내 주셔서 감사합니다. 저의 원래 json 데이터에는 둘 이상의 배우자가 포함되어 있습니다. jsFiddle을 위해 단축했습니다. 여기에 여러 명의 배우자가있는 http://jsfiddle.net/mj58659094/StWcr/1/이 있습니다. json의 personId : personId : "1000101"Father-3 (SMJ), 두 번 결혼, 첫 번째 아내는 personId : "1000102"이고 두 번째 아내는 personId : "1000103", 두 번째 배우자는 표시되지 않지만 또 다른 문제입니다. – mj8591

답변

4

업데이트 : 당신의 onclick 문제를 해결하기 위해 나는 당신이 바로 생각

가장 좋은 방법은 아래의 편집은 사람으로 (대신 중첩 된 그룹) 같은 그룹에있는 사람의 배우자를 유지하는 것입니다 . 그 외에도 onclick을 잘못된 위치에 적용하고 있다고 생각합니다. 내 조언은 대신하면서, 모두 사람과 그/그녀의 배우자를 포함하는 그룹에 onclick을 적용하고, 현재 다음

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

  1. 변경 라인 325-330이다 각 사람/배우자마다 onclick을 별도로 사용하고 싶습니다. 이 변경을 한 후에는 각 노드의 rect (노드 그룹 g 대신)이 선택되었는지 (노드 355-365) 테스트하도록 코드를 업데이트해야합니다. 또한 CSS 파일의 라인 25와 29에서 .node rect.normal.node rect.selected 스타일로 CSS를 업데이트해야합니다.

  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)을 가진 그룹에서 각 사람을 넣어

  1. 가/텍스트 clickedNode입니다 라는.
  2. 나는 (위에서 설명한 바와 같이) 각 그룹의 배우자를 개별적으로 클릭 할 수 있도록 배치했다 (라인 229-232).
  3. resetNodePersonSelectedsetNodePersonSelected 기능을 수정하여 배우자가 자녀 이외에 검색/업데이트되도록했습니다.

위의 고급 수준의 변경 사항을 설명했지만 구현에 대해 더 궁금한 점이 있으면 알려 주시기 바랍니다.

+1

다시 한 번, 제 코드를 검토해 주셔서 감사합니다. 나는 onClick 시나리오를 이미 시도했다. 이 경우 직사각형 만 클릭 할 수있게됩니다. 이름 텍스트 위로 마우스를 가져 가면 클릭 할 수 없습니다. 그래서 클릭 이벤트가 g 요소에 연결됩니다. 감사. – mj8591

+1

텍스트를 클릭 할 수있는 좋은 점. 위의 업데이트 된 답변을 참조하십시오. – mdml

+0

정말 고마워요. 귀하의 솔루션은 완벽하게 작동합니다. 여러 배우자 시나리오를 구현하겠습니다. 다시 한번 고마워요. – mj8591