Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

D3 DataMaps: OnClick Events on Bubbles

I am following the datamaps docs and I am trying to set an onClick listener to the bubbles I am rendering on the svg. Now, the svg div has the following sub tags:

<svg>
  <g id class="datamaps-subunits">..</g>
  <g id class="bubbles">..</g>
</svg>

The docs say this should be done in the following way, for the countries listed on the map:

done: function(datamap) {
            datamap.svg.selectAll('.datamaps-subunits').on('click', function() {
              alert("hello");  
            });
        }

And this works fine, while trying to click on particular regions on the map.

Trying to attach the same listener to bubbles class does nothing..

done: function(datamap) {
            datamap.svg.selectAll('.bubbles').on('click', function() {
                alert("hello"); 
            });
        }
like image 843
Claudiu S Avatar asked Nov 30 '14 16:11

Claudiu S


1 Answers

By the time done runs, bubbles haven't been added yet since bubbles is a plugin.

new Datamap returns an object with a d3 selection at svg:

var map = new Datamap({...}); 
//add bubbles
map.bubbles(bubbleData);
//handle bubble clicks
map.svg.selectAll('.bubbles').on('click', function() {...});

That should work for the first batch of bubbles.

If you are dynamically adding bubbles and don't want to reset the listeners, you can use jQuery event delegation to handle the dynamic bubbles:

$(map.svg[0][0]).on('click', '.bubbles', function(e) {
  //handle click here as well
});
like image 135
markmarkoh Avatar answered Sep 29 '22 13:09

markmarkoh