首页 文章

单击Chart.js中饼图上的事件

提问于
浏览
48

我有一个关于Chart.js的问题 .

我使用提供的文档绘制了多个饼图 . 我想知道如果单击其中一个图表的某个切片,我可以根据该切片的值进行ajax调用吗?

例如,如果这是我的 data

var data = [
    {
        value: 300,
        color:"#F7464A",
        highlight: "#FF5A5E",
        label: "Red"
    },
    {
        value: 50,
        color: "#46BFBD",
        highlight: "#5AD3D1",
        label: "Green"
    },
    {
        value: 100,
        color: "#FDB45C",
        highlight: "#FFC870",
        label: "Yellow"
    }
],

是否有可能点击 Red 标记的切片并调用以下形式的网址: example.com?label=red&value=300 ?如果是,我该如何解决这个问题?

10 回答

  • 0

    Update: 正如@Soham Shetty评论, getSegmentsAtEvent(event) 仅适用于1.x而且适用于2.x getElementsAtEvent .

    .getElementsAtEvent(e)在事件点下查找元素,然后返回相同数据索引处的所有元素 . 这在内部用于“标签”模式突出显示 . 在Chart实例上调用getElementsAtEvent(event)传递事件的参数或jQuery事件,将返回该事件的相同位置的点元素 . canvas.onclick = function(evt){
    var activePoints = myLineChart.getElementsAtEvent(evt);
    // => activePoints是画布上与click事件位于同一位置的点数组 .
    };

    示例:https://jsfiddle.net/u1szh96g/208/


    原始答案(对Chart.js 1.x版本有效):

    您可以使用 getSegmentsAtEvent(event) 实现此目的

    在Chart实例上调用getSegmentsAtEvent(event),传递事件的参数或jQuery事件,将返回该事件的相同位置的段元素 .

    来自:Prototype Methods

    所以你可以这样做:

    $("#myChart").click( 
        function(evt){
            var activePoints = myNewChart.getSegmentsAtEvent(evt);           
            /* do something */
        }
    );
    

    这是一个完整的工作示例:

    <html>
        <head>
            <script type="text/javascript" src="http://code.jquery.com/jquery-2.0.2.js"></script>
            <script type="text/javascript" src="Chart.js"></script>
            <script type="text/javascript">
                var data = [
                    {
                        value: 300,
                        color:"#F7464A",
                        highlight: "#FF5A5E",
                        label: "Red"
                    },
                    {
                        value: 50,
                        color: "#46BFBD",
                        highlight: "#5AD3D1",
                        label: "Green"
                    },
                    {
                        value: 100,
                        color: "#FDB45C",
                        highlight: "#FFC870",
                        label: "Yellow"
                    }
                ];
    
                $(document).ready( 
                    function () {
                        var ctx = document.getElementById("myChart").getContext("2d");
                        var myNewChart = new Chart(ctx).Pie(data);
    
                        $("#myChart").click( 
                            function(evt){
                                var activePoints = myNewChart.getSegmentsAtEvent(evt);
                                var url = "http://example.com/?label=" + activePoints[0].label + "&value=" + activePoints[0].value;
                                alert(url);
                            }
                        );                  
                    }
                );
            </script>
        </head>
        <body>
            <canvas id="myChart" width="400" height="400"></canvas>
        </body>
    </html>
    
  • 50

    使用Chart.JS版本 2.1.3 ,比这个更早的答案不再有效 . 使用getSegmentsAtEvent(event)方法将在控制台上输出此消息:

    getSegmentsAtEvent不是一个函数

    所以我认为必须将其删除 . 老实说,我没有阅读任何更改日志 . 要解决这个问题,只需使用 getElementsAtEvent(event) 方法,因为它可以找到on the Docs .

    在下面可以找到获得有效点击切片标签和值的脚本 . 请注意,检索标签和值也略有不同 .

    var ctx = document.getElementById("chart-area").getContext("2d");
    var chart = new Chart(ctx, config);
    
    document.getElementById("chart-area").onclick = function(evt)
    {   
        var activePoints = chart.getElementsAtEvent(evt);
    
        if(activePoints.length > 0)
        {
          //get the internal index of slice in pie chart
          var clickedElementindex = activePoints[0]["_index"];
    
          //get specific label by index 
          var label = chart.data.labels[clickedElementindex];
    
          //get value by index      
          var value = chart.data.datasets[0].data[clickedElementindex];
    
          /* other stuff that requires slice's label and value */
       }
    }
    

    希望能帮助到你 .

  • 1

    Chart.js 2.0使这更容易 .

    您可以在文档中的常见图表配置下找到它 . 应该更多的饼图 .

    options:{
        onClick: graphClickEvent
    }
    
    function graphClickEvent(event, array){
        if(array[0]){
            foo.bar; 
        }
    }
    

    它会在整个图表上触发,但如果您点击饼图,那个饼图的模型包括可用于获取值的索引 .

  • 2

    工作正常的图表部门onclick

    ChartJS:饼图 - 添加选项“onclick”

    options: {
                        legend: {
                            display: false
                        },
                        'onClick' : function (evt, item) {
                            console.log ('legend onClick', evt);
                            console.log('legd item', item);
                        }
                    }
    
  • 6

    几天以后我遇到了同样的问题,今天我找到了解决方案 . 我已经显示了准备执行的完整文件 .

    <html>
    <head><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.js">
    </script>
    </head>
    <body>
    <canvas id="myChart" width="200" height="200"></canvas>
    <script>
    var ctx = document.getElementById("myChart").getContext('2d');
    var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
        datasets: [{
            label: '# of Votes',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(75, 192, 192, 0.2)',
                'rgba(153, 102, 255, 0.2)',
                'rgba(255, 159, 64, 0.2)'
            ],
            borderColor: [
                'rgba(255,99,132,1)',
                'rgba(54, 162, 235, 1)',
                'rgba(255, 206, 86, 1)',
                'rgba(75, 192, 192, 1)',
                'rgba(153, 102, 255, 1)',
                'rgba(255, 159, 64, 1)'
            ],
            borderWidth: 1
        }]
    },
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero:true
                }
            }]
        },
    onClick:function(e){
        var activePoints = myChart.getElementsAtEvent(e);
        var selectedIndex = activePoints[0]._index;
        alert(this.data.datasets[0].data[selectedIndex]);
    
    
    }
    }
    });
    </script>
    </body>
    </html>
    
  • 5

    如果使用“请求图表”,并且您希望阻止用户在图表圈子周围的空白处单击时触发您的事件,则可以使用以下替代方法:

    var myDoughnutChart = new Chart(ctx).Doughnut(data);
    
    document.getElementById("myChart").onclick = function(evt){
        var activePoints = myDoughnutChart.getSegmentsAtEvent(evt);
    
        /* this is where we check if event has keys which means is not empty space */       
        if(Object.keys(activePoints).length > 0)
        {
            var label = activePoints[0]["label"];
            var value = activePoints[0]["value"];
            var url = "http://example.com/?label=" + label + "&value=" + value
            /* process your url ... */
        }
    };
    
  • 63

    如果您使用的是TypeScript,则代码有点时髦,因为没有类型推断,但这可以获取已提供给图表的数据的索引:// events public chartClicked(e:any):void { //console.log(e);

    try {
            console.log('DS ' + e.active['0']._datasetIndex);
            console.log('ID ' +  e.active['0']._index);
            console.log('Label: ' + this.doughnutChartLabels[e.active['0']._index]);
            console.log('Value: ' + this.doughnutChartData[e.active['0']._index]);
    
    
        } catch (error) {
            console.log("Error In LoadTopGraph", error);
        }
    
        try {
            console.log(e[0].active);
        } catch (error) {
            //console.log("Error In LoadTopGraph", error);
        }
    
    
    
    }
    
  • -2

    要成功跟踪点击事件以及用户点击的图元素,我在.js文件中执行了以下操作:我设置了以下变量:

    vm.chartOptions = {
        onClick: function(event, array) {
            let element = this.getElementAtEvent(event);
            if (element.length > 0) {
                var series= element[0]._model.datasetLabel;
                var label = element[0]._model.label;
                var value = this.data.datasets[element[0]._datasetIndex].data[element[0]._index];
            }
        }
    };
    vm.graphSeries = ["Series 1", "Serries 2"];
    vm.chartLabels = ["07:00", "08:00", "09:00", "10:00"];
    vm.chartData = [ [ 20, 30, 25, 15 ], [ 5, 10, 100, 20 ] ];
    

    然后在我的.html文件中,我按如下方式设置图表:

    <canvas id="releaseByHourBar" 
        class="chart chart-bar"
        chart-data="vm.graphData"
        chart-labels="vm.graphLabels" 
        chart-series="vm.graphSeries"
        chart-options="vm.chartOptions">
    </canvas>
    
  • 21
    var ctx = document.getElementById('pie-chart').getContext('2d');
     var myPieChart = new Chart(ctx, {
                    // The type of chart we want to create
                    type: 'pie',
    
                });
    
                 //define click event
      $("#pie-chart").click(
                function (evt) {
                    var activePoints = myPieChart.getElementsAtEvent(evt);
                    var labeltag = activePoints[0]._view.label;
    
                          });
    
  • 12

    在选项中放置你的onclick并调用你需要的函数作为你需要的ajax的例子,我将留下这个例子,这样每次点击一个点都会告诉你值,你可以在你的新函数中使用它 .

    options: {
            plugins: {
                // Change options for ALL labels of THIS CHART
                datalabels: {
                    color: 'white',
                    //backgroundColor:'#ffce00',
                    align: 'start'
                }
            },
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero:true,
                        fontColor: "white"
                    },gridLines: {
                            color: 'rgba(255,255,255,0.1)',
                            display: true
                        }
                }],
                xAxes: [{
                    ticks: {
                        fontColor: "white"
                    },gridLines: {                        
                            display: false
                        }
                }]
            },
            legend: {
            display: false
    
        },
        //onClick: abre     
            onClick:function(e){ 
        var activePoints = myChart.getElementsAtEvent(e); 
        var selectedIndex = activePoints[0]._index; 
        alert(this.data.datasets[0].data[selectedIndex]); 
    
    
    } 
        }
    

相关问题