2013-06-21 16 views
6

İçinde hepsi bir veri nesnesinden oluşturulan değişken sayıda rect öğesi bulunan daha fazla SVG olan bir SVG var. İşte genel hiyerarşisi şöyledir:Bir SVG'de alt öğelere giriş/çıkış yaparken mouseenter/mouseleave olayları neden tetiklenir?

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

Ben .child-svg elemanlarına MouseEnter/mouseLeave olayları bağlı ettik ama benim fare <rect> elemanları arasına boşluk gittiğinde olaylar ateş olduğunu buluyorum. Mouseenter/mouseleave hakkındaki anlayışım, imleç çocuk öğelerine girdiğinde/çıkarken ateş etmemeleridir - bu, mouseover/mouseout'tan bekleyeceğiniz davranışa benziyor. Ve elbette, en sevdiğim şey, fare bölümleri/mouseleave olayları için her bölümü bıraktığım zaman (sadece renkleri kullanarak çizdiğim) ateş etmektir.

İşte alakalı keman var: http://jsfiddle.net/ysim/yVfuK/4/

Düzenleme: Ben .child-svg elemanlarını bir yüksekliğe ve genişliğe vererek çalıştı, ancak bu da işe görünmüyordu: http://jsfiddle.net/ysim/gMXuU/3

Düzenleme: İşte var @ pornel'in önerisine göre düzeltildi, çözüm ile keman: http://jsfiddle.net/ysim/HUHAQ/

Teşekkürler!

+0

Hangi tarayıcıyı sen fare işaretçisi görünmez eleman "görünür" hale getirmek için pointer-events:all eklemek arka

  • olarak dolgusuz bir <rect> ekleyin:


    İşte çözüm kullanarak? Benim için istenen etkiye sahip gibi görünüyor. – musicnothing

  • +3

    Etkinlik yayılımı hakkında bilgi edinin http://stackoverflow.com/questions/4616694/what-is-event-bubbling-and-capturing – Givi

    +0

    Bu, gerçekten "" yerine SVG-in-SVG mi? – Kornel

    cevap

    5

    Tahminimce, .child-svg'un kendi alanında herhangi bir alanı yoktur, bu yüzden doğrudan üzerine gelmenin bir yolu yoktur. Fare <rect>'dan ayrıldığında .child-svg'u bırakır.

    SVG akış düzenine sahip değil, bu nedenle çocuklar ana öğenin boyutunu etkilemez. http://jsfiddle.net/gMXuU/4/

    +2

    "" öğeleri kapsayıcılardır ve tıklanabilir bir alana sahip değildirler (örneğin, "viewport-fill" özelliğini kullanarak sağlam bir arka plana sahiplerse değişir). –

    +0

    Harika, bu çözüm işe yaradı! – 3cheesewheel

    +0

    Biraz daha basit bir durum vardı ... bir çocuk SVG görüntüleyen bir DIV. DIV için mouseenter, mouseleave ve click işleyicileri vardı, ancak SVG DIV'de istenmeyen fare ve fare olaylarına neden oluyordu. Kornel'in cevabını okuduktan sonra, '' pointer-events '' stilinin uygulanmasının SVG'ye uygulanmasının istenmeyen davranışları engellediğini buldum. IOW, SVG artık farenin bakış açısından mevcut değildi. Mükemmel! 'Pointer-events' Kornel hakkında bahşiş için teşekkürler! –