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
相关产品推荐
相关产品推荐

