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

Laravel项目中Chart.js鼠标悬停显示旧数据问题求助

Chart.js 切换数据后鼠标悬停显示旧数据的修复方案

问题描述

在Laravel项目中使用Chart.js创建折线图,搭配3个按钮切换月/周/日维度的用户数据。点击按钮时更新了图表的labels和datasets.data,但鼠标悬停图表时仍会显示旧数据。

问题演示:
问题演示动图

问题代码

var ctx = document.getElementById("chartBig1").getContext('2d');

var gradientStroke = ctx.createLinearGradient(0, 230, 0, 50);

gradientStroke.addColorStop(1, 'rgba(72,72,176,0.1)');
gradientStroke.addColorStop(0.4, 'rgba(72,72,176,0.0)');
gradientStroke.addColorStop(0, 'rgba(119,52,169,0)'); //purple colors

var config = {
    type: 'line',
    data: {
        labels: @json($userDataMonth['labels']),
        datasets: [{
            label: "Users",
            fill: true,
            backgroundColor: gradientStroke,
            borderColor: '#d346b1',
            borderWidth: 2,
            borderDash: [],
            borderDashOffset: 0.0,
            pointBackgroundColor: '#d346b1',
            pointBorderColor: 'rgba(255,255,255,0)',
            pointHoverBackgroundColor: '#d346b1',
            pointBorderWidth: 20,
            pointHoverRadius: 4,
            pointHoverBorderWidth: 15,
            pointRadius: 4,
            data: @json($userDataMonth['data']),
        }]
    },
    options: gradientChartOptionsConfigurationWithTooltipPurple
};
var myChartData = new Chart(ctx, config);

$("#0").click(function() {
    var data = myChartData.config.data;
    data.datasets[0].data = @json($userDataMonth['data']);
    data.labels = @json($userDataMonth['labels']);
    myChartData.update();
});

$("#1").click(function() {
    var data = myChartData.config.data;
    data.datasets[0].data = @json($userDataWeek['data']);
    data.labels = @json($userDataWeek['labels']);
    myChartData.update();
});

$("#2").click(function() {
    var data = myChartData.config.data;
    data.datasets[0].data = @json($userDataDay['data']);
    data.labels = @json($userDataDay['labels']);
    myChartData.update();
});

修复方案

问题出在直接修改了Chart实例的config.data,而Chart.js内部是基于实例自身的data属性维护状态的,修改config不会同步到内部状态,导致tooltip读取旧缓存数据。

修改按钮点击事件的逻辑,直接操作Chart实例的data属性,再调用update():

// 替换原有的三个点击事件
$("#0").click(function() {
    myChartData.data.labels = @json($userDataMonth['labels']);
    myChartData.data.datasets[0].data = @json($userDataMonth['data']);
    myChartData.update('none'); // 使用'none'动画模式可避免过渡问题,也可留空使用默认动画
});

$("#1").click(function() {
    myChartData.data.labels = @json($userDataWeek['labels']);
    myChartData.data.datasets[0].data = @json($userDataWeek['data']);
    myChartData.update('none');
});

$("#2").click(function() {
    myChartData.data.labels = @json($userDataDay['labels']);
    myChartData.data.datasets[0].data = @json($userDataDay['data']);
    myChartData.update('none');
});

补充方案(彻底重置)

如果上述方法仍有缓存残留问题,可以尝试先销毁旧图表再重建,确保状态完全重置:

// 示例:按日维度重建图表
$("#2").click(function() {
    // 销毁旧实例
    myChartData.destroy();
    // 重新创建图表
    myChartData = new Chart(ctx, {
        type: 'line',
        data: {
            labels: @json($userDataDay['labels']),
            datasets: [{
                // 复用原有配置项
                label: "Users",
                fill: true,
                backgroundColor: gradientStroke,
                borderColor: '#d346b1',
                borderWidth: 2,
                borderDash: [],
                borderDashOffset: 0.0,
                pointBackgroundColor: '#d346b1',
                pointBorderColor: 'rgba(255,255,255,0)',
                pointHoverBackgroundColor: '#d346b1',
                pointBorderWidth: 20,
                pointHoverRadius: 4,
                pointHoverBorderWidth: 15,
                pointRadius: 4,
                data: @json($userDataDay['data']),
            }]
        },
        options: gradientChartOptionsConfigurationWithTooltipPurple
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:53:24