2013-07-05 26 views
8

İç içe geçmiş öğeler kümem var (SVG). Kök öğesi grafiktir ve çocuklar grafikteki öğelerdir (çizgi, eksen vb.). Basitleştirilmiş örnek:d3.on ("mouseover") olayı iç içe geçmiş SVG öğeleriyle çalışmaz

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

Sorunum mainGraph elemana (örneğin D3.on ("fare") ile) mouseover/mousemove olay bağlamak eğer ben bir üzerine fareyi hareket, sadece tetikler olmasıdır Çocuk elemanlarının

Okuduğum şeylerden biri, daha sonraki öğelerin önceliği olduğu için, tüm alt öğelere .style ("işaretçi-olaylar", "yok") ekledim, ancak çalışmadı.

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

I (sizin örnekte mainGraph) <g> eleman inanıyoruz:

cevap

8

Bir yaklaşım sonradan eklenen unsurlar tarafından yakalanmış değil fare olaylarını yakalamak için ilk unsur olarak tüm yüzeyi dolduran bir dikdörtgen eklemektir sadece bir kaptır, fare olaylarını alabilen gerçek bir şekil değildir.

Fare olay dinleyicisini svg öğesinin kendisine ekleyebiliyor olabilirsiniz, ancak <g>'un çalışacağını düşünmüyorum.

+0

için css özelliğini eklemektir. –

+3

A 'g' elemanı (div’in tersi) yalnızca şekilsiz bir kapsayıcıdır ve dolayısıyla boyutları yoktur. Dolayısıyla, fareyi dikdörtgen bir alana uygulamak istiyorsanız, bu “rect” gibi dikdörtgen içerikler belirtmeniz gerekir. Ancak, kullanışlı bir iyileştirme dolgu kullanıyor: none ve pointer-events: all styles. – mbostock

+0

@mbostock İşaretçi-olayları doğrudan eleman üzerinde kullanıp CSS özelliklerine göre ayarlayarak fark yaratır mı? '' '' '' '' '' '' '' '' '' '' '' '' '' Elemanında aynı şekilde davranır mı? – amenadiel

1

rect öğesinin kullanılması dışında, olayların tetiklenmesi için bu gibi bir CSS özelliğinin pointer-events: all; olması gerekir.

+0

Evet, 'pointer-events' değerini ayarlamak için, yuvalanmış olsun ya da olmasın, anahtardır. Varsayılan değer, yalnızca "visiblePainted" olduğunda etkinlikleri kabul etmesini sağlar, bkz. Https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events. – Felix

0

Aynı sorunlarla karşılaşıyorum.
çözüm açıkça boyutlarını ayarlarsanız çalışmalıdır `g` kullanarak üst öğesine

pointer-events: stroke; 

veya

pointer-events: visibleStroke; 
İlgili konular