2014-04-08 9 views
38

को घटना मैं एक डी 3 हिस्टोग्राम चार्ट है, जो पर मैं सलाखों के लिए एक 'onclick' घटना संलग्न किया है। मैं चार्ट की पृष्ठभूमि में एक 'ऑनक्लिक' ईवेंट भी संलग्न करना चाहता हूं (यानी चार्ट में हर जगह जो बार नहीं है), लेकिन मुझे इससे परेशानी हो रही है। मैं कई तरह से घटना संलग्न की कोशिश की है, लेकिन हर मामले में, इस नई घटना मेरी ओवरराइड करने के लिए लगता है बार-क्लिक करें:अटैच किया जा रहा 'onclick' डी 3 चार्ट पृष्ठभूमि

कुछ प्रयास:

$("svg:not('.bar')").on("click", function(){ //do stuff }); 

$("g:not('.bar')").on("click", function(){ //do stuff }); 

var svg = d3.select("#histogram_block").append("svg") 
     .attr("width", width + margin.left + margin.right) 
     .attr("height", height + margin.top + margin.bottom) 
     .append("g") 
     .attr("transform", "translate(" + margin.left + "," + margin.top + ")") 
     .on("click", function(d,i){ 
      if (d) { //do stuff} 
      else { //do stuff } 
     }; 

मैं यह सोचते हैं रहा हूँ वहाँ डालने का एक तरीका है एसवीजी ऑब्जेक्ट को इवेंट हैंडलर शुरू होने पर, लेकिन मुझे इसके बारे में जाने का सही तरीका नहीं पता है।

+2

बस एक अनुस्मारक। '$ (" svg: नहीं ('बार') ") 'का अर्थ है' एसवीजी 'जिसमें' बार 'वर्ग नहीं है। इसका मतलब यह नहीं है कि 'bar' वर्ग वाले तत्वों के बाहर 'svg's section प्राप्त करें। –

उत्तर

46

घटना वास्तव में ओवरराइड नहीं है, लेकिन दोनों ट्रिगर हैं - onclick एसवीजी के लिए हैंडलर और बार के लिए हैंडलर। इसे रोकने के लिए, .stopPropagation() विधि का उपयोग करें (the documentation देखें)। कोड इस तरह दिखता है:

rect.on("click", function() { 
    console.log("rect"); 
    d3.event.stopPropagation(); 
}); 

पूर्ण उदाहरण here। घटना here के प्रचार को रोकने के साथ व्यवहार के साथ तुलना करें।

+0

महान उदाहरण, धन्यवाद। आपको इसे उत्तर में जोड़ना चाहिए क्योंकि यह बहुत छोटा है। तो जब मैं क्लिक करता हूं तो घटनाओं का क्रम क्या निर्धारित करता है? ऐसा लगता है कि आयताकार की क्लिक घटना पहले आग लगती है, लेकिन क्या यह हमेशा मामला होगा? – woemler

+0

घटनाक्रम "बुलबुला" डीओएम। 'Rect' 'svg' का बच्चा है, इसलिए यह ईवेंट को' svg' पर प्रसारित करता है। यही कारण है कि '.stopPropagation()' काम करता है। तो हाँ, 'रेक्ट के क्लिक हैंडलर को हमेशा पहले आग लगनी चाहिए। –

+0

धन्यवाद, लेकिन क्या होगा यदि एसवीजी के दोनों बच्चे चार्ट तत्वों को ओवरलैप कर रहे हों? जो पहले उनके क्लिक इवेंट को आग लगाएगा? – woemler

2

इस उदाहरण में (लाइन 246: http://tributary.io/inlet/8361294) मैं कुल चार्ट क्षेत्र के बराबर & ऊंचाई के साथ एक नया रेक्ट जोड़ता हूं, फिर मेरे माउस (या क्लिक) ईवेंट संलग्न करता है।

svg.append("rect") 
     .attr({"class": "overlay" , "width": width , "height": height}) 
     .on({ 
      "mouseover": function() { /* do stuff */ }, 
      "mouseout": function() { /* do stuff */ }, 
      "click": function() { /* do stuff */ }, 
     }); 
+0

यह प्रश्न का उत्तर नहीं देता है, क्योंकि यह चार्ट की पृष्ठभूमि बनाम अग्रभूमि तत्व पर क्लिक नहीं करता है। – rjurney

संबंधित मुद्दे