我对Chart.js有疑问。
我使用提供的文档绘制了多个饼图。我想知道如果单击其中一个图表的某个切片,我可以根据该切片的值进行ajax调用吗?
例如,如果这是我的data
var data = [
{
value: 300,
color:"#F7464A",
highlight: "#FF5A5E",
label: "Red"
},
{
value: 50,
color: "#46BFBD",
highlight: "#5AD3D1",
label: "Green"
},
{
value: 100,
color: "#FDB45C",
highlight: "#FFC870",
label: "Yellow"
}
],
我是否可以点击Red
标记的切片并调用以下表单的网址:
example.com?label=red&value=300
?如果是的话,我该怎么做?
答案 0 :(得分:68)
更新:正如@Soham Shetty评论,getSegmentsAtEvent(event)
仅适用于1.x而且适用于2.x getElementsAtEvent
。
<强> .getElementsAtEvent(e)中强>
在事件点下查找元素,然后返回所有元素 在相同的数据索引。这在内部用于标签&#39;模式 高亮。
在您的图表实例上调用
getElementsAtEvent(event)
传递 事件的参数或jQuery事件将返回点元素 就是那个事件的同一个位置。canvas.onclick = function(evt){ var activePoints = myLineChart.getElementsAtEvent(evt); // => activePoints is an array of points on the canvas that are at the same position as the click event. };
示例:https://jsfiddle.net/u1szh96g/208/
原始答案(对Chart.js 1.x版有效):
您可以使用getSegmentsAtEvent(event)
在您的图表实例上调用
getSegmentsAtEvent(event)
传递 事件的参数或jQuery事件将返回该段 与该事件处于同一位置的元素。
所以你可以这样做:
$("#myChart").click(
function(evt){
var activePoints = myNewChart.getSegmentsAtEvent(evt);
/* do something */
}
);
以下是一个完整的工作示例:
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-2.0.2.js"></script>
<script type="text/javascript" src="Chart.js"></script>
<script type="text/javascript">
var data = [
{
value: 300,
color:"#F7464A",
highlight: "#FF5A5E",
label: "Red"
},
{
value: 50,
color: "#46BFBD",
highlight: "#5AD3D1",
label: "Green"
},
{
value: 100,
color: "#FDB45C",
highlight: "#FFC870",
label: "Yellow"
}
];
$(document).ready(
function () {
var ctx = document.getElementById("myChart").getContext("2d");
var myNewChart = new Chart(ctx).Pie(data);
$("#myChart").click(
function(evt){
var activePoints = myNewChart.getSegmentsAtEvent(evt);
var url = "http://example.com/?label=" + activePoints[0].label + "&value=" + activePoints[0].value;
alert(url);
}
);
}
);
</script>
</head>
<body>
<canvas id="myChart" width="400" height="400"></canvas>
</body>
</html>
答案 1 :(得分:50)
使用Chart.JS版本 2.1.3 ,超过此版本的答案将不再有效。 使用getSegmentsAtEvent(event)方法将在控制台上输出以下消息:
getSegmentsAtEvent不是函数
所以我认为必须将其删除。老实说,我没有阅读任何更改日志。要解决此问题,请使用getElementsAtEvent(event)
方法,因为可以找到on the Docs。
在下面可以找到获得有效点击切片标签和值的脚本。请注意,检索标签和值也略有不同。
var ctx = document.getElementById("chart-area").getContext("2d");
var chart = new Chart(ctx, config);
document.getElementById("chart-area").onclick = function(evt)
{
var activePoints = chart.getElementsAtEvent(evt);
if(activePoints.length > 0)
{
//get the internal index of slice in pie chart
var clickedElementindex = activePoints[0]["_index"];
//get specific label by index
var label = chart.data.labels[clickedElementindex];
//get value by index
var value = chart.data.datasets[0].data[clickedElementindex];
/* other stuff that requires slice's label and value */
}
}
希望它有所帮助。
答案 2 :(得分:21)
Chart.js 2.0让这更容易。
您可以在文档中的常见图表配置下找到它。应该更多的饼图。
options:{
onClick: graphClickEvent
}
function graphClickEvent(event, array){
if(array[0]){
foo.bar;
}
}
它在整个图表上触发,但是如果你点击一个饼图,那个饼图的模型包括可以用来获取值的索引。
答案 3 :(得分:12)
工作正常的图表部门onclick
ChartJS:饼图 - 添加选项“onclick”
options: {
legend: {
display: false
},
'onClick' : function (evt, item) {
console.log ('legend onClick', evt);
console.log('legd item', item);
}
}
答案 4 :(得分:7)
几天后我遇到了同样的问题,今天我找到了解决方案。我已经展示了可以执行的完整文件。
<html>
<head><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.js">
</script>
</head>
<body>
<canvas id="myChart" width="200" height="200"></canvas>
<script>
var ctx = document.getElementById("myChart").getContext('2d');
var 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],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255,99,132,1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero:true
}
}]
},
onClick:function(e){
var activePoints = myChart.getElementsAtEvent(e);
var selectedIndex = activePoints[0]._index;
alert(this.data.datasets[0].data[selectedIndex]);
}
}
});
</script>
</body>
</html>
答案 5 :(得分:5)
如果使用“请求图表”,并且您希望阻止用户在图表圈子周围的空白区域内点击您的活动,则可以使用以下替代方法:
var myDoughnutChart = new Chart(ctx).Doughnut(data);
document.getElementById("myChart").onclick = function(evt){
var activePoints = myDoughnutChart.getSegmentsAtEvent(evt);
/* this is where we check if event has keys which means is not empty space */
if(Object.keys(activePoints).length > 0)
{
var label = activePoints[0]["label"];
var value = activePoints[0]["value"];
var url = "http://example.com/?label=" + label + "&value=" + value
/* process your url ... */
}
};
答案 6 :(得分:2)
如果您使用TypeScript,代码有点时髦,因为没有类型推断,但这可以获取已提供给图表的数据的索引: //事件 public chartClicked(e:any):void { //console.log(e);
try {
console.log('DS ' + e.active['0']._datasetIndex);
console.log('ID ' + e.active['0']._index);
console.log('Label: ' + this.doughnutChartLabels[e.active['0']._index]);
console.log('Value: ' + this.doughnutChartData[e.active['0']._index]);
} catch (error) {
console.log("Error In LoadTopGraph", error);
}
try {
console.log(e[0].active);
} catch (error) {
//console.log("Error In LoadTopGraph", error);
}
}
答案 7 :(得分:1)
要成功跟踪点击事件以及用户点击的图表元素,我在.js文件中执行了以下操作:我设置了以下变量:
vm.chartOptions = {
onClick: function(event, array) {
let element = this.getElementAtEvent(event);
if (element.length > 0) {
var series= element[0]._model.datasetLabel;
var label = element[0]._model.label;
var value = this.data.datasets[element[0]._datasetIndex].data[element[0]._index];
}
}
};
vm.graphSeries = ["Series 1", "Serries 2"];
vm.chartLabels = ["07:00", "08:00", "09:00", "10:00"];
vm.chartData = [ [ 20, 30, 25, 15 ], [ 5, 10, 100, 20 ] ];
然后在我的.html文件中,我按如下方式设置图表:
<canvas id="releaseByHourBar"
class="chart chart-bar"
chart-data="vm.graphData"
chart-labels="vm.graphLabels"
chart-series="vm.graphSeries"
chart-options="vm.chartOptions">
</canvas>
答案 8 :(得分:0)
var ctx = document.getElementById('pie-chart').getContext('2d');
var myPieChart = new Chart(ctx, {
// The type of chart we want to create
type: 'pie',
});
//define click event
$("#pie-chart").click(
function (evt) {
var activePoints = myPieChart.getElementsAtEvent(evt);
var labeltag = activePoints[0]._view.label;
});
答案 9 :(得分:0)
您可以在选项部分添加一个 onClick 函数,如下所示:
options : {
cutoutPercentage: 50, //for donuts pie
onClick: function(event, chartElements){
if(chartElements){
console.log(chartElements[0].label);
}
},
},
chartElements[0]
是图表中被点击的部分,无需再使用 getElementsAtEvent
。
它适用于图表 v2.9.4
答案 10 :(得分:0)
我有一个优雅的解决方案来解决这个问题。如果您有多个数据集,则确定单击了哪个数据集会变得棘手。 _datasetIndex 始终返回零。 但这应该可以解决问题。它也会为您提供标签和数据集标签。 请注意 ** this.getElementAtEvent** 在 getElement 中没有 s
options: {
onClick: function (e, items) {
var firstPoint = this.getElementAtEvent(e)[0];
if (firstPoint) {
var label = firstPoint._model.label;
var val = firstPoint._model.datasetLabel;
console.log(label+" - "+val);
}
}
}
答案 11 :(得分:-2)
在选项内放置onclick并将所需的函数作为示例所需的ajax进行调用,我将保留该示例,以便每次单击某个点都会告诉您该值,并且可以在新函数中使用它。 / p>
options: {
plugins: {
// Change options for ALL labels of THIS CHART
datalabels: {
color: 'white',
//backgroundColor:'#ffce00',
align: 'start'
}
},
scales: {
yAxes: [{
ticks: {
beginAtZero:true,
fontColor: "white"
},gridLines: {
color: 'rgba(255,255,255,0.1)',
display: true
}
}],
xAxes: [{
ticks: {
fontColor: "white"
},gridLines: {
display: false
}
}]
},
legend: {
display: false
},
//onClick: abre
onClick:function(e){
var activePoints = myChart.getElementsAtEvent(e);
var selectedIndex = activePoints[0]._index;
alert(this.data.datasets[0].data[selectedIndex]);
}
}