Chart.js: 如何监听hover/click 小区外的事件?

Chart.js: how to listen to hover/click events outside of plot area?

如何创建一个条形图来侦听绘图区域外的悬停和单击事件?

简单演示:

const ctx = document.getElementById('myChart').getContext('2d');
const 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],
        }]
    },
    options: {
        onHover: () => console.log("hover"),
        onClick: () => console.log("click"),
    }
});
<script src="https://cdn.jsdelivr.net/npm/chart.js@3.6.0/dist/chart.min.js"></script>
<canvas id="myChart" width="400" height="400"></canvas>

如上面的演示所示,当事件发生在绘图区域之外时,悬停和点击回调不会被触发,例如单击轴刻度标签时。

您可以使用 afterEvent 挂钩编写自定义插件,以捕获所有事件。在这里您可以过滤掉您想要的事件,例如 mousemovemouseoutclick 或通过与 canvas.

交互引发的任何其他事件

const options = {
  type: 'line',
  data: {
    labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
    datasets: [{
        label: '# of Votes',
        data: [12, 19, 3, 5, 2, 3],
        borderColor: 'pink'
      },
      {
        label: '# of Points',
        data: [7, 11, 5, 8, 3, 7],
        borderColor: 'orange'
      }
    ]
  },
  options: {},
  plugins: [{
    id: 'customEventListner',
    afterEvent: (chart, evt, opts) => {
      console.log(evt.event.type, evt.event.x, evt.event.y)
    }
  }]
}

const ctx = document.getElementById('chartJSContainer').getContext('2d');
new Chart(ctx, options);
<body>
  <canvas id="chartJSContainer" width="600" height="400"></canvas>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.6.0/chart.js"></script>
</body>