Chart.js предоставляет встроенную модель событий, основанную на
обработке canvas-элемента и системе взаимодействий (interaction system).
События onClick и onHover работают не как
DOM-события для отдельных элементов графика, а как интерпретация
координат курсора относительно отрисованных элементов (точек, столбцов,
сегментов и т.д.), что требует понимания механизма определения активных
элементов (active elements).
Внутри Chart.js события взаимодействия строятся вокруг трёх ключевых сущностей:
Каждое взаимодействие преобразуется в запрос: какие элементы графика находятся под курсором в момент события.
Основной механизм поиска элементов:
interaction.modeintersectСобытие onClick задаётся в конфигурации графика и
вызывается при каждом клике по canvas.
Базовая структура:
const config = {
type: 'bar',
data,
options: {
onClick: (event, elements, chart) => {
// логика обработки клика
}
}
};
event Сырой DOM-событие. Используется для получения координат:
elements Массив активных элементов под курсором:
[
{
datasetIndex: 0,
index: 3
}
]
datasetIndex — индекс набора данныхindex — индекс элемента внутри datasetchart Экземпляр графика, позволяющий:
Частый сценарий — получение данных точки:
onClick: (event, elements, chart) => {
if (!elements.length) return;
const el = elements[0];
const dataset = chart.data.datasets[el.datasetIndex];
const value = dataset.data[el.index];
console.log(value);
}
Здесь важно, что elements уже отфильтрован системой
взаимодействия, поэтому дополнительная геометрическая проверка не
требуется.
При более сложных сценариях используется ручной запрос элементов:
const elements = chart.getElementsAtEventForMode(
event,
'nearest',
{ intersect: true },
true
);
Параметры:
mode — стратегия поиска (nearest,
index, dataset, x,
y)options — правила пересеченияuseFinalPosition — учитывать ли анимациюЭтот подход полезен, когда требуется переопределить поведение
стандартного onClick.
1. Drill-down (проваливание в данные) Клик по сегменту диаграммы открывает детализированный уровень данных.
2. Навигация Использование графика как интерактивного меню.
3. Изменение состояния интерфейса Выбор элемента графика как фильтра для таблицы.
Событие onHover вызывается при движении курсора над
canvas. Оно тесно связано с системой tooltip и hover interaction.
options: {
onHover: (event, elements, chart) => {
// логика при наведении
}
}
Работа hover зависит от:
interaction: {
mode: 'nearest',
intersect: true
}
mode: 'nearest' — ближайший элемент к курсоруintersect: true — курсор должен пересекать элементevent Содержит координаты движения мыши.
elements Массив активных элементов под курсором,
аналогично onClick.
chart Экземпляр графика для динамических изменений.
onHover: (event, elements, chart) => {
const target = event.native ? event.native.target : event.target;
target.style.cursor = elements.length
? 'pointer'
: 'default';
}
Это распространённый паттерн для создания ощущения интерактивности.
Chart.js автоматически использует hover-события для управления tooltip.
Поведение можно контролировать:
options: {
plugins: {
tooltip: {
enabled: true
}
}
}
При наведении система:
Иногда требуется эмулировать hover:
chart.setActiveElements([
{ datasetIndex: 0, index: 2 }
]);
chart.tooltip.setActiveElements([
{ datasetIndex: 0, index: 2 }
]);
chart.update();
Это используется для синхронизации нескольких графиков.
onClick
onHover
При интенсивных графиках (большие datasets) важно учитывать:
Практика оптимизации:
1. Минимизация логики внутри onHover Тяжёлые операции выносятся в debounce:
let timer;
onHover: (event, elements) => {
clearTimeout(timer);
timer = setTimeout(() => {
// тяжёлая логика
}, 50);
}
2. Проверка наличия элементов
if (!elements.length) return;
При наличии нескольких наборов данных:
elements = [
{ datasetIndex: 0, index: 4 },
{ datasetIndex: 1, index: 4 }
]
Это характерно для stacked charts и комбинированных визуализаций.
Логика обработки должна учитывать приоритет dataset:
При отключении стандартного поведения:
options: {
events: [],
onClick: customHandler
}
График перестаёт автоматически вычислять active elements, и разработчик полностью управляет логикой через:
В основе обработки событий лежит преобразование:
Это позволяет точно определять элементы даже при масштабировании и анимациях.
Chart.js унифицирует mouse и touch:
На мобильных устройствах hover часто заменяется кратковременным активным состоянием элемента.