2013-06-21 14 views
6

Ho uno SVG, all'interno della quale vi sono più SVG con un numero variabile di elementi rect loro interno, tutti generati da un oggetto dati. Ecco la gerarchia generale:Perché gli eventi mouseenter/mouseleave si attivano quando si immettono/escono elementi figlio in un SVG?

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

ho legato MouseEnter/eventi MouseLeave agli .child-svg elementi, ma mi sto trovando che gli eventi stanno sparando quando il mio mouse va al spazi bianchi tra le <rect> elementi. La mia comprensione di mouseenter/mouseleave è che non dovrebbero sparare quando il cursore entra/esce dagli elementi figlio - questo sembra un comportamento che ti aspetteresti da mouseover/mouseout. E, naturalmente, quello che mi piacerebbe idealmente è che gli eventi mouseenter/mouseleave si attivino solo quando ho lasciato ogni sezione (che ho delineato usando i colori).

Ecco il violino rilevanti: http://jsfiddle.net/ysim/yVfuK/4/

Edit: ho provato dando i .child-svg elementi di altezza e larghezza, ma che non sembrano lavorare sia: http://jsfiddle.net/ysim/gMXuU/3

Edit: Ecco il violino con la soluzione, fissata secondo il suggerimento di @ porneL: http://jsfiddle.net/ysim/HUHAQ/

Grazie!

+0

Quale browser usando? Sembra avere l'effetto desiderato per me. – musicnothing

+3

leggere di propagazione degli eventi http://stackoverflow.com/questions/4616694/what-is-event-bubbling-and-capturing – Givi

+0

È davvero SVG-in-SVG, piuttosto che '' ? – Kornel

risposta

5

La mia ipotesi è che .child-svg non abbia un'area a sé stante, quindi non c'è modo di passare il mouse direttamente. Quando il mouse lascia <rect> lascia anche .child-svg.

SVG non ha il layout del flusso, quindi i bambini non influiscono sulla dimensione dell'elemento padre.


Ecco la soluzione: http://jsfiddle.net/gMXuU/4/

  • aggiungere un <rect> senza riempimento come sfondo
  • aggiungere pointer-events:all per rendere elemento invisibile "visibile" al puntatore del mouse
+2

Gli '' elementi sono contenitori e non hanno alcuna area cliccabile stessi (questo cambia se hanno un solido background, per esempio utilizzando la proprietà 'finestra-fill'). –

+0

Impressionante, questa soluzione ha funzionato! – 3cheesewheel

+0

Ho avuto un caso un po 'più semplice ... un DIV che mostrava SVG di un bambino. Avevo mouseenter, mouseleave e click handlers per il DIV, ma SVG causava indesiderati eventi di mouseleave e mouseenter sul DIV. Dopo aver letto la risposta di Kornel, ho scoperto che applicare gli 'pointer-events 'di stile: none' a SVG impediva il comportamento indesiderato. IOW, l'SVG non esisteva più dalla prospettiva del mouse. Perfezionare! Grazie per il suggerimento su 'pointer-events' Kornel! –

Problemi correlati