javascript - Chart.js:饼图图例 "onclick"会被 "options.onclick"覆盖(如果两者都存在)

标签 javascript chart.js chartjs-2.6.0

我有一个饼图,当您单击图表的一部分时,需要调用一个函数;如果单击图例中的标签,则需要调用另一个不同的函数。我希望通过以下方式实现此行为:

options: {
            responsive: true,
            legend: {
                position: 'right',
                onClick: function (event, elem) {
                    graph_legend_click(elem.text);
                },
            },
            onClick: function (event) {
                graph_click( event);
            }
        }

但实际上,只有第二个 onclick(调用 graph_click(event);)才会真正执行。图例 onClick 不起作用。 我该怎么做才能防止第二个 onClick 覆盖第一个?

最佳答案

只能通过坐标来区分点击事件......条件是:

  • event.clientY >= chart.boxes[0].height ,当 legend已开启top .

  • event.clientX <= chart.boxes[0].left ,当 legendright .

也可以使用类似的条件,当 legendleft或访问bottom .

var chart;
var config = {
    type: 'pie',
    data: {
        datasets: [{
            data: [
                Math.round(Math.random() * 100),
                Math.round(Math.random() * 100),
                Math.round(Math.random() * 100),
                Math.round(Math.random() * 100),
                Math.round(Math.random() * 100)
            ],
            backgroundColor: [
                "rgb(255, 99, 132)",
                "rgb(255, 159, 64)",
                "rgb(255, 205, 86)",
                "rgb(75, 192, 192)",
                "rgb(54, 162, 235)"
            ],
            label: 'Dataset 1'
        }],
        labels: [
            'Red',
            'Orange',
            'Yellow',
            'Green',
            'Blue'
        ]
    },
    options: {
        responsive: true,
        onClick: function (event) {
            
            /* checking where the click actually happens */
            var box = chart.boxes[0];
            if((box.position === "top" && event.clientY >= box.height) || (box.position === "right" && event.clientX <= box.left)) {
                console.log("chart click  @ x: " + event.clientX + ", y:" + event.clientY);
            }
        },
        legend: {
            position: 'top',
            onClick: function (event, elem) {
                console.log("legend click @ x: " + event.clientX + ", y:" + event.clientY);
            }
        }
    }
};

$(function() {
  chart = new Chart($('#chart-area')[0].getContext('2d'), config);
});
html, body {height: 100%; width: 100%; margin: 0;}
canvas#chart-area {height: 100px; width: 100px;}
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>
<div id="canvas-holder"><canvas id="chart-area"></canvas></div>

关于javascript - Chart.js:饼图图例 "onclick"会被 "options.onclick"覆盖(如果两者都存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52381043/

相关文章:

java - 使用 JSPDF 在客户端生成 PDF

javascript - ChartJS AJAX 加载标签和数据

javascript - Chart.js 设置 donut 背景颜色?

javascript - 使用chart js打印图表

chart.js - Clojurescript/Reagent/Chart.js - 试剂生命周期 - Chart.update()

javascript - 获取在我的处理函数中存储 useSelector 的变量的访问权限

javascript - 路由端点内部/外部的Node.js,Express和对象实例化

javascript - 动态更新网页图片

angular - 如何将 Chart.js 与 Typescript 一起使用而不会出现可分配的错误?

javascript - ChartJs 图表不会更新新值