2013-07-05 4 views
8

के साथ काम नहीं करती है मेरे पास तत्वों का एक घोंसला सेट (एसवीजी) है। मूल तत्व ग्राफ है, और बच्चे ग्राफ (रेखाएं, अक्ष, आदि) में तत्व हैं। सरलीकृत उदाहरण:d3.on ("mouseover") घटना नेस्टेड एसवीजी तत्वों

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

मेरे समस्या यह है कि अगर मैं mainGraph तत्व के लिए माउसओवर/MouseMove घटना बाँध (उदाहरण के लिए D3.on ("माउसओवर") के साथ), यह केवल चलाता है अगर मैं एक से अधिक माउस ले जाते है बाल तत्वों का।

मैंने जो कुछ पढ़ा है, उनमें से एक यह है कि बाद के तत्वों की प्राथमिकता है, इसलिए मैंने सभी बाल तत्वों के लिए स्टाइल ("पॉइंटर-इवेंट्स", "कोई नहीं") जोड़ा, लेकिन यह काम नहीं किया।

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

मैं (अपने उदाहरण में mainGraph) का मानना ​​है <g> तत्व:

उत्तर

8

एक दृष्टिकोण पहला तत्व के रूप में पूरी सतह भरने माउस घटनाओं कि बाद में जोड़ा तत्वों द्वारा पकड़ा नहीं कर रहे हैं पकड़ने के लिए एक आयत को जोड़ने के लिए है सिर्फ एक कंटेनर है, वास्तविक आकार नहीं है जो माउस ईवेंट प्राप्त कर सकता है।

आप शायद svg तत्व पर माउस इवेंट श्रोता जोड़ सकते हैं, लेकिन मुझे नहीं लगता कि <g> काम करेगा।

+0

'g' का उपयोग करता है, तो आप उसके आयाम स्पष्ट रूप से सेट करने के लिए काम करना चाहिए सीएसएस संपत्ति जोड़ना है। –

+3

ए 'जी' तत्व ('div' के विपरीत) सिर्फ एक आकारहीन कंटेनर है, और इसमें कोई आयाम नहीं है। इसलिए, यदि आप माउसओवर को आयताकार क्षेत्र पर लागू करना चाहते हैं, तो आपको आयताकार सामग्री जैसे कि 'rect' निर्दिष्ट करना होगा। हालांकि, एक उपयोगी परिष्करण भरने का उपयोग कर रहा है: कोई भी और सूचक-घटनाओं: सभी शैलियों। – mbostock

+0

@mbostock क्या यह सूचकांक पर सीधे पॉइंटर-इवेंट का उपयोग करते हुए इसे अपने सीएसएस गुणों में सेट करने में कोई फर्क पड़ता है? क्या '' 'g''' के अंदर' '' path''' तत्व समान व्यवहार करता है? – amenadiel

1

rect तत्व का उपयोग करने के अलावा, इसे ट्रिगर होने के लिए इस pointer-events: all; की तरह एक सीएसएस प्रॉपर्टी सेट होना चाहिए।

+0

हां, 'पॉइंटर-इवेंट' सेट करने के लिए कुंजी है, इससे कोई फर्क नहीं पड़ता कि यह घोंसला है या नहीं। डिफ़ॉल्ट मान इसे 'दृश्यमान' होने पर केवल ईवेंट स्वीकार करेगा, https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events देखें। – Felix

0

मुझे भी एक ही समस्या का सामना करना पड़ता है।
समाधान पेरेंट तत्व

pointer-events: stroke; 

या

pointer-events: visibleStroke; 
संबंधित मुद्दे