2013-07-05 2 views
8

중첩 된 요소 집합 (SVG)이 있습니다. 루트 요소는 그래프이고 자식 요소는 그래프의 요소 (선, 축 등)입니다. 간단한 예 :중첩 된 SVG 요소로 d3.on ("mouseover") 이벤트가 작동하지 않습니다.

<g transform="translate(80,10)" id="mainGraph"> 
    <g class="Line"> 
     <path d="....."></path> 
    </g> 
</g> 

내 문제는 내가 mainGraph 요소 (예를 들어 D3.on ("마우스 오버")와 함께) 마우스 오버/MouseMove 이벤트 이벤트를 결합하면 내가 하나를 위로 마우스를 이동하는 경우, 그것은 단지 트리거이다 자식 요소들.

내가 읽은 것 중 하나는 이후 요소의 우선 순위가 있으므로 모든 자식 요소에 .style ("포인터 이벤트", "없음")을 추가했지만 작동하지 않는다는 것입니다.

something.append('svg:rect') 
    .attr('width', width) // the whole width of g/svg 
    .attr('height', height) // the whole heigh of g/svg 
    .attr('fill', 'none') 
    .attr('pointer-events', 'all') 
    .on('mouseover', function() { 
     // do something 
    }  
    }); 

내가 (당신의 예에서 mainGraph)를 <g> 요소를 믿는다

답변

8

한 가지 방법은 나중에 추가 요소에 의해 체포되지 않은 마우스 이벤트를 잡으려고 첫 번째 요소로 표면 전체를 채우는 사각형을 추가하는 것입니다 마우스 이벤트를 수신 할 수있는 실제 모양이 아니라 컨테이너 일뿐입니다.

svg 요소 자체에 마우스 이벤트 수신기를 추가 할 수는 있지만 <g>이 작동하지 않을 것이라고 생각합니다.

+0

에 CSS 속성을 추가하는 것입니다. –

+3

'g' 요소 ('div'와는 달리)는 형태가없는 컨테이너이므로 치수가 없습니다. 마우스 오버를 직사각형 영역에 적용하려면이 사각형과 같은 직사각형의 내용을 지정해야합니다. 그러나 하나의 유용한 개선점은 fill : none 및 pointer-events : 모든 스타일을 사용하는 것입니다. – mbostock

+0

@mbostock 요소에서 포인터 이벤트를 직접 사용하거나 CSS 속성에서 포인터 이벤트를 사용하면 어떤 차이가 있습니까? ''''''내부의''path'' 요소는 같은 방식으로 동작합니까? – amenadiel

1

요소는 rect과 별개로 이벤트가 트리거되도록하려면 pointer-events: all;과 같은 CSS 속성을 설정해야합니다.

+0

예, 중첩 여부에 관계없이 '포인터 이벤트'를 설정하는 것이 중요합니다. 기본값은'visiblePainted' 일 때만 이벤트를 받도록합니다. https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events를보십시오. – Felix

0

나는 또한 동일한 문제에 직면 해있다.
이 솔루션은 사용자가 명시 적으로 크기를 설정하면 작동한다`g`를 사용하여 부모 요소

pointer-events: stroke; 

또는

pointer-events: visibleStroke; 
관련 문제