Tareq Salah
Tareq Salah

Reputation: 3718

Click on label - Pie chart jQuery Flot

I'm using jQuery flot pie chart, I used embedded labels in interactive pie chart. When I click on one of the sectors in pie chart it shows alert but when I click on label that is embedded in the sector it doesn't respond to the click action. Is there is any solution for this?

My source code

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="http://static.pureexample.com/js/flot/excanvas.min.js"></script>
<script src="http://static.pureexample.com/js/flot/jquery.flot.min.js"></script>
<script src="http://static.pureexample.com/js/flot/jquery.flot.pie.min.js"></script>

<!-- CSS -->
<style type="text/css">
#flotcontainer {
    width: 600px;
    height: 400px;
    text-align: left;
}
</style>

<!-- Javascript -->
<script type="text/javascript">
$(function () { 
    var data = [
        {label: "data1", data:10},
        {label: "data2", data: 20},
        {label: "data3", data: 30},
        {label: "data4", data: 40},
        {label: "data5", data: 50},
        {label: "data6", data: 60},
        {label: "data7", data: 70}
    ];

    var options = {
            series: {
                pie: {
                    show: true,
                    radius: 1,
                    tilt: 0.5,
                    label:{                        
                        radius: 3/4,
                        formatter: function (label, series) {
                            return '<div style="border:1px solid gray;font-size:8pt;text-align:center;padding:5px;color:white;">' + label + '<br/>' +   
                            Math.round(series.percent) + '%</div>';
                        },
                        background: {
                            opacity: 0.5,
                            color: '#000'
                        }
                    }
                }
            },
            legend: {
                show: false
            },
            grid: {
                hoverable: true,
                clickable: true
            }
         };

    $.plot($("#flotcontainer"), data, options);  

    $("#flotcontainer").bind("plothover", function(event, pos, obj){
        if (!obj){return;}
        percent = parseFloat(obj.series.percent).toFixed(2);

        var html = [];
        html.push("<div style=\"flot:left;width:105px;height:20px;text-align:center;border:1px solid black;background-color:", obj.series.color, "\">",
                  "<span style=\"font-weight:bold;color:white\">", obj.series.label, " (", percent, "%)</span>",
                  "</div>");

        $("#showInteractive").html(html.join(''));        
    });
   $("#flotcontainer").bind("plotclick", function(event, pos, obj){
        if (!obj){return;}
        percent = parseFloat(obj.series.percent).toFixed(2);
        alert(obj.series.label + " ("+ percent+ "%)");

    });


});
</script>

<!-- HTML -->
<div>
    Hover percent : <span id="showInteractive"></span>
</div>
<div id="flotcontainer"></div>

If you want to try it, you can use this editor

http://plnkr.co/edit/LvUuMYIYUAi3RZRYGSjV?p=preview

Upvotes: 1

Views: 6511

Answers (3)

dashingdove
dashingdove

Reputation: 435

This can also be solved by ignoring pointer events on the labels.

CSS:

  .pieLabel {
    pointer-events: none;
  }

The labels are in front of the sectors so they block you from clicking on the sectors directly. When you set pointer-events to none, the labels are ignored so you click the sectors underneath instead.

Upvotes: 0

Mark
Mark

Reputation: 108512

Another option here is to manually pass the event down:

$('.pieLabel').bind('click',function(e){
    $("#flotcontainer .flot-overlay").trigger(e);
});

Any click on a pie label will now manually call a click event on flot's overlay canvas. This will in turn call into the plotclick event.

Updated plunkr

Upvotes: 5

Nicolas R
Nicolas R

Reputation: 14609

You can add $(".pieLabel").click(function() { alert("clicked"); }); to get the clicks on the pie labels

Sample:

$("#flotcontainer").bind("plotclick", function(event, pos, obj){
    if (!obj){return;}
    alert('hello');

});

$(".pieLabel").click(function() { alert("clicked"); });

Other solution to use your series info: add a call to a custom function when you define the legend (onclick on the div), and pass the right parameters:

series: {
    pie: {
        show: true,
        radius: 1,
        tilt: 0.5,
        label:{                        
            radius: 3/4,
            formatter: function (label, series) {
                return '<div onclick="legendClicker(' + series.percent + ');" style="border:1px solid gray;font-size:8pt;text-align:center;padding:5px;color:white;">' + label + '<br/>' +   
                Math.round(series.percent) + '%</div>';
            },
            background: {
                opacity: 0.5,
                color: '#000'
            }
        }
    }
},

And the function:

function legendClicker(info) {
  // Do what you want
  alert("legend click / " + info);
}

Upvotes: 3

Related Questions