javascript - 在 CharJS 中重新激活数据值
问题描述
我这里有一个小情况。
我在同一页面中有 2 个图表,每次用户单击第一个图表时,第二个图表都会更改数据属性...第一次单击时一切正常,但是如果我单击第一个图表的另一段并返回之前点击的上一段,我的图表的动画根本不起作用,数据立即出现,没有任何动画。
我已经尝试重置()。但根本行不通。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="assets/main.css">
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.7.0/dist/Chart.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels"></script>
</head>
<body>
<section id="banner_topo">
<p>Cronograma</p>
</section>
<div id="graficos">
<div class="graficoAnual" style="float: left; left: 0px; width: 800px; margin-top: 10px;">
<canvas id="myChartAno"></canvas>
</div>
<div id="graficoMensal">
<p id="mes">Valores Mensais</p>
<canvas id="myChartMes" class="chartjs-render-monitor"></canvas>
</div>
</div>
<script>
var dataAno = {
datasets: [{
data: [300, 150, 100,500,323,145,665,143,211,100,123,400],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C",
"#9400D3",
"#4169E1",
"#CD5C5C",
"#FF6347",
"#20B2AA",
"#3CB371",
"#FF8C00",
"#DAA520",
"#B0E0E6"
]
}],
labels: [
"Janeiro",
"Feveireiro",
"Março",
"Abril",
"Maio",
"Junho",
"Julho",
"Agosto",
"Setembro",
"Outubro",
"Novembro",
"Dezembro"
]
};
var canvasAno = document.getElementById("myChartAno");
var ctxAno = canvasAno.getContext("2d");
var myNewChartAno = new Chart(ctxAno, {
type: 'doughnut',
data: dataAno,
options: {
legend: {
position: 'bottom',
fullWidth: true
},
animation: {
duration: 4000
}
}
});
var dataLimpa = {
datasets: [{
data: [0, 0, 0],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
],
};
var dataJan = {
datasets: [{
data: [30, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
],
};
var dataFev = {
datasets: [{
data: [150, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataMar = {
datasets: [{
data: [5, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataAbr = {
datasets: [{
data: [32, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataMai = {
datasets: [{
data: [654, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataJun = {
datasets: [{
data: [53, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataJul = {
datasets: [{
data: [21, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataAgo = {
datasets: [{
data: [423, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataSet = {
datasets: [{
data: [1300, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataOut = {
datasets: [{
data: [213, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataNov = {
datasets: [{
data: [765, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataDez = {
datasets: [{
data: [3100, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var canvasMes = document.getElementById("myChartMes");
var ctxMes = canvasMes.getContext("2d");
var myNewChartMes = new Chart(ctxMes, {
type: 'bar',
data: dataDez,
options:{
responsive: true,
scales: {
xAxes: [{
stacked: true,
}],
yAxes: [{
stacked: true
}]
},
}
});
canvasAno.onclick = function(evt){
var activePoints = myNewChartAno.getElementsAtEvent(evt);
if (activePoints[0]) {
var chartData = activePoints[0]['_chart'].config.data;
var idx = activePoints[0]['_index'];
var mesclicado;
var dataSelect;
switch (idx){
case 0:
mesclicado = 'Janeiro';
dataSelect = dataJan;
break;
case 1:
mesclicado = 'Fevereiro';
dataSelect = dataFev;
break;
case 2:
mesclicado = 'Março';
dataSelect = dataMar;
break;
case 3:
mesclicado = 'Abril';
dataSelect = dataAbr;
break;
case 4:
mesclicado = 'Maio';
dataSelect = dataMai;
break;
case 5:
mesclicado = 'Junho';
dataSelect = dataJun;
break;
case 6:
mesclicado = 'Julho';
dataSelect = dataJul;
break;
case 7:
mesclicado = 'Agosto';
dataSelect = dataAgo;
break;
case 8:
mesclicado = 'Setembro';
dataSelect = dataSet;
break;
case 9:
mesclicado = 'Outubro';
dataSelect = dataOut;
break;
case 10:
mesclicado = 'Novembro';
dataSelect = dataNov;
break;
case 11:
mesclicado = 'Dezembro';
dataSelect = dataDez;
break;
}
document.getElementById('mes').innerHTML = mesclicado;
myNewChartMes.data = dataSelect;
myNewChartMes.update();
myNewChartMes.render({
duration: 800,
lazy: false,
});
}
}
</script>
</body>
</html>
有人能帮我吗?
解决方案
我也遇到了同样的问题,动画仅在第一次唯一更新时才有效,但是找不到根本原因。
但是有一个很好且简单的方法可以完成此操作,即在销毁前一个图表后渲染一个新图表。我已经使用 jQuery 克隆配置以在下面的代码中创建一个新图表,但您也可以使用纯 javascript。请参阅下面的代码或此工作小提琴-> http://jsfiddle.net/jpzg7w2k/1/
var dataAno = {
datasets: [{
data: [300, 150, 100, 500, 323, 145, 665, 143, 211, 100, 123, 400],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C",
"#9400D3",
"#4169E1",
"#CD5C5C",
"#FF6347",
"#20B2AA",
"#3CB371",
"#FF8C00",
"#DAA520",
"#B0E0E6"
]
}],
labels: [
"Janeiro",
"Feveireiro",
"Março",
"Abril",
"Maio",
"Junho",
"Julho",
"Agosto",
"Setembro",
"Outubro",
"Novembro",
"Dezembro"
]
};
var canvasAno = document.getElementById("myChartAno");
var ctxAno = canvasAno.getContext("2d");
var myNewChartAno = new Chart(ctxAno, {
type: 'doughnut',
data: dataAno,
options: {
legend: {
position: 'bottom',
fullWidth: true
},
animation: {
duration: 4000
}
}
});
var dataLimpa = {
datasets: [{
data: [0, 0, 0],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
],
};
var dataJan = {
datasets: [{
data: [30, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
],
};
var dataFev = {
datasets: [{
data: [150, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataMar = {
datasets: [{
data: [5, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataAbr = {
datasets: [{
data: [32, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataMai = {
datasets: [{
data: [654, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataJun = {
datasets: [{
data: [53, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataJul = {
datasets: [{
data: [21, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataAgo = {
datasets: [{
data: [423, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataSet = {
datasets: [{
data: [1300, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataOut = {
datasets: [{
data: [213, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataNov = {
datasets: [{
data: [765, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var dataDez = {
datasets: [{
data: [3100, 50, 100],
backgroundColor: [
"#F7464A",
"#46BFBD",
"#FDB45C"
]
}],
labels: [
"Red",
"Green",
"Yellow"
]
};
var canvasMes = document.getElementById("myChartMes");
var ctxMes = canvasMes.getContext("2d");
var myNewChartMes = new Chart(ctxMes, {
type: 'bar',
data: dataDez,
options: {
responsive: true,
scales: {
xAxes: [{
stacked: true,
}],
yAxes: [{
stacked: true
}]
},
}
});
canvasAno.onclick = function(evt) {
var activePoints = myNewChartAno.getElementsAtEvent(evt);
if (activePoints[0]) {
var chartData = activePoints[0]['_chart'].config.data;
var idx = activePoints[0]['_index'];
var mesclicado;
var dataSelect;
switch (idx) {
case 0:
mesclicado = 'Janeiro';
dataSelect = dataJan;
break;
case 1:
mesclicado = 'Fevereiro';
dataSelect = dataFev;
break;
case 2:
mesclicado = 'Março';
dataSelect = dataMar;
break;
case 3:
mesclicado = 'Abril';
dataSelect = dataAbr;
break;
case 4:
mesclicado = 'Maio';
dataSelect = dataMai;
break;
case 5:
mesclicado = 'Junho';
dataSelect = dataJun;
break;
case 6:
mesclicado = 'Julho';
dataSelect = dataJul;
break;
case 7:
mesclicado = 'Agosto';
dataSelect = dataAgo;
break;
case 8:
mesclicado = 'Setembro';
dataSelect = dataSet;
break;
case 9:
mesclicado = 'Outubro';
dataSelect = dataOut;
break;
case 10:
mesclicado = 'Novembro';
dataSelect = dataNov;
break;
case 11:
mesclicado = 'Dezembro';
dataSelect = dataDez;
break;
}
document.getElementById('mes').innerHTML = mesclicado;
var config = $.extend(true, {}, myNewChartMes.config);
var canvasMes = document.getElementById("myChartMes");
var ctxMes = canvasMes.getContext("2d");
config.data = dataSelect;
if(myNewChartMes)
{
myNewChartMes.destroy();
}
myNewChartMes = new Chart(ctxMes, config);
}
}
推荐阅读
- python - 如何使用 Python 找出图像中的所有数字及其位置?
- node.js - 赛普拉斯 - 错误:无法解析“async_hooks”
- javascript - Openpgp 的 PGP 密钥解密错误 - TypeError:无法在 SecretKey.decrypt 处读取 null 的属性“类型”
- download - 如何使用 rsync 从窗口服务器提高下载到 ubuntu 本地 PC 的速度?
- delphi - 如何循环组件 nethttpclient Generics.Collections
- python - 使用 Python 将 PDF 文本提取到文本文件中 - 提取错误
- c# - 带有用户输入的倒数计时器以设置时间c#
- javascript - 频道成员没有得到更新
- google-sheets - 我正在尝试将公式应用于谷歌翻译的整个列
- python - 如何使用python在线程中的函数之间共享数据