You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单页多Doughnut图表Tooltip异常:均显示最后一个图表的提示框

解决Chart.js多Doughnut图表Tooltip全部显示最后一个数据的问题

嘿,这问题我太熟啦!你碰到的是JavaScript引用类型的经典坑——所有的Doughnut图表都共用了同一个dataDoughnutChart对象,导致最后所有Tooltip都显示最后一次循环的数据。

问题根源

在你的代码里,dataDoughnutChart是在循环外面定义的,每次循环你只是修改这个对象的属性值,但并没有创建新的对象。因为对象是引用类型,所有图表实例都会指向同一个内存地址的对象。当循环结束时,这个对象里保存的是最后一次循环修改的数据,所以所有图表的Tooltip都会读取这个最终状态。

修复方案

把数据对象的创建逻辑移到循环内部,让每个图表都拥有自己独立的数据副本,这样就不会互相干扰了。修改后的代码如下:

var idList = [];
jQuery('.idKQI').each(function (i) {
 idList.push( jQuery(this).text() );
});
var idListLength = idList.length;

// 配置项可以复用,因为循环中没有修改它的属性
var optionsDoughnutChart = {
 maintainAspectRatio: false,
 responsive: true,
 legend: {
 display: false
 },
 tooltips: {
 mode: 'dataset'
 }
};

var idLav;
var ctxDoughnut;
var labelAdd;
var errati;
var esatti;

for (var i = 0, max = idListLength; i < max; i++) {
 idLav = '#' + idList[i] + "_chartDoughnut";
 ctxDoughnut = jQuery(idLav);
 labelAdd = jQuery(idLav).data("labeladd");
 errati = jQuery(idLav).data("errati");
 esatti = jQuery(idLav).data("esatti");

 // 关键:每次循环都创建全新的data对象,确保每个图表有独立数据
 var dataDoughnutChart = {
 labels: [ 'Errati' + labelAdd, 'Esatti' + labelAdd ],
 datasets: [{
 data: [errati, esatti],
 backgroundColor: [
 '#DF0101', // red
 '#31B404' // green
 ]
 }]
 };

 var myDoughnutChart = new Chart(ctxDoughnut, {
 type: 'doughnut',
 data: dataDoughnutChart,
 options: optionsDoughnutChart
 });
}

效果说明

修改后,每个图表实例都会绑定自己专属的dataDoughnutChart对象,循环结束后每个对象的状态都是对应图表的原始数据,Tooltip就能正确显示对应图表的内容啦——比如你说的两个图表,第一个会显示[10,90],第二个显示[2,98],不会再串数据了。

内容的提问来源于stack exchange,提问作者Giorgio A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:00:08