javascript - Chart.js 混合图表的 OnClick 事件,我点击的是哪张图表?
编辑:已修改以添加选项,并提供了一个建议的(来自答案的)chartClickEvent,这里有一个 jsfiddle:http://jsfiddle.net/jmpxgufu/174/
请设想一个具有以下配置的 Chart.js 混合图表:
var config = {
type: 'bar',
data: {
labels: ["Test","Test","Test"],
datasets: [{
label: 'Dataset1',
yAxisID: 'Dataset1',
type: "line",
borderColor: "red",
backgroundColor: "red",
data: [70,60,50],
fill: false
},
{
label: 'Dataset0',
type: "bar",
backgroundColor: "blue",
data: [100,90,80]
}]
},
options: {
scales: {
xAxes: [{ barPercentage: 1.0 }],
yAxes: [{ id: 'Dataset1', position: 'left', type: 'linear',
ticks: { display: false, min: 0, beginAtZero: true, max: 120 },
scaleLabel: { display: true, labelString: "TestScale" } }]
},
responsive: true,
maintainAspectRatio: false,
legend : { display: true, position: 'bottom' },
onClick: chartClickEvent
}
}; // end of var config
function chartClickEvent(event, array)
{
if (window.myChart === undefined || window.myChart == null)
{
return;
}
if (event === undefined || event == null)
{
return;
}
if (array === undefined || array == null)
{
return;
}
if (array.length <= 0)
{
return;
}
var active = window.myChart.getElementAtEvent(event);
if (active === undefined || active == null)
{
return;
}
var elementIndex = active[0]._datasetIndex;
console.log("elementIndex: " + elementIndex + "; array length: " + array.length);
if (array[elementIndex] === undefined || array[elementIndex] == null)
{
return;
}
var chartData = array[elementIndex]['_chart'].config.data;
var idx = array[elementIndex]['_index'];
var label = chartData.labels[idx];
var value = chartData.datasets[elementIndex].data[idx];
var series = chartData.datasets[elementIndex].label;
alert(series + ':' + label + ':' + value);
}
正如我的 chartClickEvent 所示,我的数组长度为 2,因为我有两个图表。这很好,但我根本不知道该如何判断使用 array[0] 还是 array[1]。如果他们点击的是折线数据点,我想对该数据(array[0])做一些操作;如果他们点击的是那个大蓝色柱状图,我想对该数据(array[1])做一些操作。我该如何判断他们是点击了折线还是柱状图?
谢谢你。
答案#1
HTML
<div id="test" style="height:600px; width:600px;">
<canvas id="myCanvas" style="border: 1px solid black; margin: 25px 25px, display: none;" height="300" >Canvas</canvas>
</div>
JS
var ctx = document.getElementById("myCanvas");
var newArr;
var config = new Chart(ctx,{
type: 'bar',
data: {
labels: ["Test","Test","Test"],
datasets: [{
label: 'Dataset1',
yAxisID: 'Dataset1',
type: "line",
borderColor: "red",
backgroundColor: "red",
data: [70,60,50],
fill: false
},
{
label: 'Dataset0',
type: "bar",
backgroundColor: "blue",
data: [100,90,80]
}]
},
options: {
scales: {
xAxes: [{ barPercentage: 1.0 }],
yAxes: [{ id: 'Dataset1', position: 'left', type: 'linear',
ticks: { display: false, min: 0, beginAtZero: true, max: 120 },
scaleLabel: { display: true, labelString: "TestScale" } }]
},
responsive: true,
maintainAspectRatio: false,
legend : { display: true, position: 'bottom' },
onClick: chartClickEvent
}
}); // end of var config
function chartClickEvent(event, array){
if(typeof newArr === 'undefined'){
newArr = array;
}
if (window.config === 'undefined' || window.config == null)
{
return;
}
if (event === 'undefined' || event == null)
{
return;
}
if (newArr === 'undefined' || newArr == null)
{
return;
}
if (newArr.length <= 0)
{
return;
}
var active = window.config.getElementAtEvent(event);
if (active === 'undefined' || active == null || active.length === 0)
{
return;
}
var elementIndex = active[0]._datasetIndex;
console.log("elementIndex: " + elementIndex + "; array length: " + newArr.length);
if (newArr[elementIndex] === 'undefined' || newArr[elementIndex] == null){
return;
}
var chartData = newArr[elementIndex]['_chart'].config.data;
var idx = newArr[elementIndex]['_index'];
var label = chartData.labels[idx];
var value = chartData.datasets[elementIndex].data[idx];
var series = chartData.datasets[elementIndex].label;
alert(series + ':' + label + ':' + value);
}
答案#2
在树状图的选项下:
options: {
onClick: (el: any, arr: any) =>
console.log('item clicked', arr[0]._index),
你向 'onClick' 函数传入 2 个参数,名字可以是任何东西,但第一个参数是 EVENT,第二个参数是一个 [N] 数组。
第二个参数是你需要的。
在这个 [N] 数组中,如果你使用 console.log,你会看到两件事可以用来识别在树状图上点击的是哪条数据。
要么:
- _index: arr[0]._index
- _options.backgroundColor: arr[0]._options.backgroundColor
你可以使用 console.log 打印这个数组:
onClick: (el: any, arr: any) =>
console.log('item clicked', arr[0]),
并查看与你的图表相关的其他内容,但我发现索引是最容易使用的。
