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

Chart.js 2.5双数据集环形图隐藏单个dataset的tooltip时报错如何解决

问题根因

报错是因为hover第二个数据集的扇区时,虽然配置了tooltip filter过滤非datasetIndex=0的项,但此时回调函数接收到的tooltipItem参数为空/不符合预期,直接读取index属性时访问了不存在的字段导致报错。

解决方法

两种方案配合使用可彻底解决问题:

  • 给第二个数据集添加hover: false配置,直接禁用该数据集的所有hover交互,从触发源头上避免tooltip回调执行
  • 在所有tooltip回调开头增加参数有效性判断,参数不符合要求时直接返回空字符串,避免非法属性读取
完整修改后代码
const data = {
    labels: ' . $custom_label . ',
    datasets: [
        {
            data: ' . $vdata . ', 
            backgroundColor: [ "#f56954", "#00a65a", "#f39c12", "#00c0ef", "#3c8dbc" ], 
            hoverOffset: 4
        },
        {
            data: ' . $cdata . ', 
            backgroundColor: [ "#fff", "#fff", "#fff", "#fff", "#fff" ], 
            hoverBackgroundColor: [ "#fff", "#fff", "#fff", "#fff", "#fff" ], 
            hoverBorderColor: [ "#fff", "#fff", "#fff", "#fff", "#fff" ],
            hover: false // 新增:禁用该数据集hover交互
        }
    ] 
};
const config = {
    type: "doughnut",
    data: data,
    options: {
        cutoutPercentage: 40,
        legend: {
            display: false
        },
        tooltips: { 
            filter: function (tooltipItem) {
               return tooltipItem.datasetIndex === 0;
            },
            callbacks: {
                title: function(tooltipItem, data) {
                        // 新增:参数合法性判断
                        if (!tooltipItem || !tooltipItem.length || tooltipItem[0].datasetIndex !== 0) return '';
                        var dataset = data["datasets"][0];
                        var percent = Math.round((dataset["data"][tooltipItem[0]["index"]] / dataset["_meta"][0]["total"]) * 100)
                        return data["labels"][tooltipItem[0]["index"]] + " " + percent + "%";
                },
                label: function(tooltipItem, data) {
                        // 新增:参数合法性判断
                        if (!tooltipItem || tooltipItem.datasetIndex !== 0) return '';
                        var dataset = data["datasets"][0];
                        var value = dataset["data"][tooltipItem["index"]];
                        return "$" + (Math.round(value * 100) / 100).toFixed(2);
                },
                afterLabel: function(tooltipItem, data) {
                        // 新增:参数合法性判断
                        if (!tooltipItem || tooltipItem.datasetIndex !== 0) return '';
                        var dataset = data["datasets"][1];
                        return dataset["data"][tooltipItem["index"]] + " " + data["labels"][tooltipItem["index"]];
                }
            },
            titleFontColor: "#fff",
            titleFontSize: 14,
            backgroundColor: "#000",
            bodyFontColor: "#fff",
            bodyFontSize: 14,
            bodySpacing: 4,
            displayColors: false
        }
    }
};
var assetsChart = new Chart( document.getElementById("assetsChart"), config );

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:36:00