2013-07-05 36 views
8

Tôi có một tập hợp các phần tử lồng nhau (SVG). Phần tử gốc là biểu đồ và trẻ em là các phần tử trong biểu đồ (đường kẻ, trục, v.v.). ví dụ đơn giản:d3.on ("di chuột") sự kiện không hoạt động với các phần tử SVG lồng nhau

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

Vấn đề của tôi là nếu tôi gắn một mouseover/sự kiện MouseMove (với D3.on ("mouseover") chẳng hạn) để các yếu tố mainGraph, nó chỉ gây ra nếu tôi di chuyển chuột lên một của các phần tử con.

Một trong những điều tôi đọc là có ưu tiên các phần tử sau, vì vậy tôi đã thêm .style ("pointer-events", "none") vào tất cả các phần tử con, nhưng điều đó không hiệu quả.

Trả lời

8

Một cách tiếp cận là để thêm một hình chữ nhật lấp đầy toàn bộ bề mặt là yếu tố đầu tiên để bắt sự kiện chuột mà không bị bắt bởi các yếu tố bổ sung sau:

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

Tôi tin rằng <g> yếu tố (mainGraph trong ví dụ của bạn) chỉ là một vùng chứa, không phải là một hình dạng thực tế có thể nhận các sự kiện chuột.

Bạn có thể thêm trình xử lý sự kiện chuột trên chính phần tử svg, nhưng tôi không nghĩ rằng <g> sẽ hoạt động.

+0

Sử dụng 'g' nên làm việc nếu bạn thiết lập kích thước của nó một cách rõ ràng. –

+3

Một phần tử 'g' (không giống như' div') chỉ là một thùng chứa không có hình dạng, và do đó không có kích thước. Vì vậy, nếu bạn muốn di chuột qua để áp dụng cho một khu vực hình chữ nhật, điều này bạn sẽ cần phải xác định nội dung hình chữ nhật như này 'rect'. Tuy nhiên, một tinh lọc hữu ích là sử dụng fill: none và pointer-events: tất cả các kiểu. – mbostock

+0

@mbostock có thực hiện bất kỳ sự khác biệt nào nếu sử dụng các sự kiện con trỏ trực tiếp trên phần tử so với cài đặt nó trong thuộc tính CSS của nó không? Phần tử '' 'path''' bên trong' '' g''' có hoạt động giống nhau không? – amenadiel

1

Ngoài việc sử dụng phần tử rect, cần có thuộc tính CSS được đặt như thế này pointer-events: all; để các sự kiện được kích hoạt.

+0

Có, để đặt 'con trỏ-sự kiện' là khóa, bất kể nó có lồng nhau hay không. Giá trị mặc định sẽ làm cho nó chỉ chấp nhận các sự kiện khi 'visiblePainted', xem https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events. – Felix

0

Tôi cũng gặp phải sự cố tương tự.
Giải pháp là thêm thuộc tính css để yếu tố phụ huynh

pointer-events: stroke; 

hoặc

pointer-events: visibleStroke;