EDIT: Modified to add options, and a suggested (from the answer) chartClickEvent, here is a jsfiddle: http://jsfiddle.net/jmpxgufu/174/
Imagine if you will a Chart.js mixed chart with the following config:
JavaScript
x
74
74
1
var config = {
2
type: 'bar',
3
data: {
4
labels: ["Test","Test","Test"],
5
datasets: [{
6
label: 'Dataset1',
7
yAxisID: 'Dataset1',
8
type: "line",
9
borderColor: "red",
10
backgroundColor: "red",
11
data: [70,60,50],
12
fill: false
13
},
14
{
15
label: 'Dataset0',
16
type: "bar",
17
backgroundColor: "blue",
18
data: [100,90,80]
19
}]
20
},
21
options: {
22
scales: {
23
xAxes: [{ barPercentage: 1.0 }],
24
yAxes: [{ id: 'Dataset1', position: 'left', type: 'linear',
25
ticks: { display: false, min: 0, beginAtZero: true, max: 120 },
26
scaleLabel: { display: true, labelString: "TestScale" } }]
27
},
28
responsive: true,
29
maintainAspectRatio: false,
30
legend : { display: true, position: 'bottom' },
31
onClick: chartClickEvent
32
}
33
}; // end of var config
34
35
function chartClickEvent(event, array)
36
{
37
if (window.myChart === undefined || window.myChart == null)
38
{
39
return;
40
}
41
if (event === undefined || event == null)
42
{
43
return;
44
}
45
if (array === undefined || array == null)
46
{
47
return;
48
}
49
if (array.length <= 0)
50
{
51
return;
52
}
53
var active = window.myChart.getElementAtEvent(event);
54
if (active === undefined || active == null)
55
{
56
return;
57
}
58
var elementIndex = active[0]._datasetIndex;
59
console.log("elementIndex: " + elementIndex + "; array length: " + array.length);
60
if (array[elementIndex] === undefined || array[elementIndex] == null)
61
{
62
return;
63
}
64
65
var chartData = array[elementIndex]['_chart'].config.data;
66
var idx = array[elementIndex]['_index'];
67
68
var label = chartData.labels[idx];
69
var value = chartData.datasets[elementIndex].data[idx];
70
var series = chartData.datasets[elementIndex].label;
71
72
alert(series + ':' + label + ':' + value);
73
}
74
As my chartClickEvent says, my array is length 2, because I have two charts. That’s great and all, but I have no idea how to figure out whether to use array[0] or array[1]. If they click specifically the line data point, I want to do something with that data (array[0]), if they click the big blue bar, I want to do something with that data (array[1]). How do I tell whether they clicked on the line or the bar?
Thank you.
Advertisement
Answer
HTML
JavaScript
1
4
1
<div id="test" style="height:600px; width:600px;">
2
<canvas id="myCanvas" style="border: 1px solid black; margin: 25px 25px, display: none;" height="300" >Canvas</canvas>
3
</div>
4
JS
JavaScript
1
81
81
1
var ctx = document.getElementById("myCanvas");
2
var newArr;
3
4
var config = new Chart(ctx,{
5
type: 'bar',
6
data: {
7
labels: ["Test","Test","Test"],
8
datasets: [{
9
label: 'Dataset1',
10
yAxisID: 'Dataset1',
11
type: "line",
12
borderColor: "red",
13
backgroundColor: "red",
14
data: [70,60,50],
15
fill: false
16
},
17
{
18
label: 'Dataset0',
19
type: "bar",
20
backgroundColor: "blue",
21
data: [100,90,80]
22
}]
23
},
24
options: {
25
scales: {
26
xAxes: [{ barPercentage: 1.0 }],
27
yAxes: [{ id: 'Dataset1', position: 'left', type: 'linear',
28
ticks: { display: false, min: 0, beginAtZero: true, max: 120 },
29
scaleLabel: { display: true, labelString: "TestScale" } }]
30
},
31
responsive: true,
32
maintainAspectRatio: false,
33
legend : { display: true, position: 'bottom' },
34
onClick: chartClickEvent
35
}
36
}); // end of var config
37
38
function chartClickEvent(event, array){
39
if(typeof newArr === 'undefined'){
40
newArr = array;
41
}
42
43
if (window.config === 'undefined' || window.config == null)
44
{
45
return;
46
}
47
if (event === 'undefined' || event == null)
48
{
49
return;
50
}
51
if (newArr === 'undefined' || newArr == null)
52
{
53
return;
54
}
55
if (newArr.length <= 0)
56
{
57
return;
58
}
59
var active = window.config.getElementAtEvent(event);
60
if (active === 'undefined' || active == null || active.length === 0)
61
{
62
return;
63
}
64
65
var elementIndex = active[0]._datasetIndex;
66
console.log("elementIndex: " + elementIndex + "; array length: " + newArr.length);
67
68
if (newArr[elementIndex] === 'undefined' || newArr[elementIndex] == null){
69
return;
70
}
71
72
var chartData = newArr[elementIndex]['_chart'].config.data;
73
var idx = newArr[elementIndex]['_index'];
74
75
var label = chartData.labels[idx];
76
var value = chartData.datasets[elementIndex].data[idx];
77
var series = chartData.datasets[elementIndex].label;
78
79
alert(series + ':' + label + ':' + value);
80
}
81