2013-06-21 15 views
6

Mam SVG, wewnątrz którego jest więcej SVG ze zmienną liczbą elementów rect wewnątrz nich, wszystkie generowane z obiektu danych. Oto ogólna hierarchia:Dlaczego zdarzenia mouseenter/mouseleave są uruchamiane podczas wprowadzania/opuszczania elementów potomnych w SVG?

<svg class="parent-svg"> 
    <svg class="child-svg"> 
     <rect /> 
     <rect /> 
    </svg> 
    <svg class="child-svg"> 
     <rect /> 
     <rect /> 
    </svg> 
</svg> 

Mam związany mouseenter/mouseLeave zdarzenia do .child-svg elementów, ale jestem stwierdzenia, że ​​zdarzenia są wypalania gdy mój myszy przechodzi do spacji pomiędzy <rect> elementów. Moje rozumienie mouseenter/mouseleave polega na tym, że nie powinny one strzelać, gdy kursor wchodzi/opuszcza elementy potomne - wydaje się to być zachowaniem, którego można się spodziewać po najechaniu myszą/myszką. I oczywiście chciałbym, aby zdarzenia mouseenter/mouseleave były uruchamiane tylko wtedy, gdy opuściłem każdą sekcję (którą wybrałem za pomocą kolorów).

Oto odnośny skrzypce: http://jsfiddle.net/ysim/yVfuK/4/

Edit: Próbowałem dając .child-svg elementy wysokość i szerokość, ale nie wydają się działać albo: http://jsfiddle.net/ysim/gMXuU/3

Edit: Oto skrzypce z rozwiązaniem, naprawione zgodnie z sugestią @ pornel: http://jsfiddle.net/ysim/HUHAQ/

Dzięki!

+0

Co przeglądarka jesteś za pomocą? Wydaje się, że przynosi pożądany efekt. – musicnothing

+3

Przeczytaj o propagacji zdarzeń http://stackoverflow.com/questions/4616694/what-is-event-bubbling-and-capturing – Givi

+0

Czy to jest naprawdę SVG-w-SVG, a nie ''? – Kornel

Odpowiedz

5

Domyślam się, że .child-svg nie ma samodzielnie żadnego obszaru, więc nie można go bezpośrednio najechać. Kiedy mysz opuszcza <rect>, pozostawia również.

SVG nie ma układu przepływu, więc dzieci nie zmieniają rozmiaru elementu nadrzędnego jako.


Oto rozwiązanie: http://jsfiddle.net/gMXuU/4/

  • dodać <rect> bez wypełnienia jako tło
  • dodać pointer-events:all zrobić niewidzialny pierwiastek "widoczny" dla wskaźnika myszy
+2

Elementy '' są kontenerami i same nie mają pola klikalnego (zmienia się to, jeśli mają one stałe tło, np. Za pomocą właściwości 'viewport-fill'). –

+0

Awesome, to rozwiązanie działało! – 3cheesewheel

+0

Miałem prostszy przypadek ... DIV, który wyświetlał dziecko SVG. Miałem program obsługi myszy, myszy i przycisków dla DIV, ale SVG powodował niepożądane zdarzenia mouseleave i mouseenter na DIV. Po przeczytaniu odpowiedzi Kornela odkryłem, że zastosowanie stylu 'wskaźnik-zdarzenia: none' do SVG zapobiegło niepożądanemu zachowaniu. IOW, SVG już nie istniało z perspektywy myszy. Idealny! Dzięki za podpowiedź o 'pointer-events' Kornel! –

Powiązane problemy