You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Chart.JS删除数据时陷入循环致浏览器卡顿问题求助

解决Chart.js删除数据点时的无限循环卡顿问题

嘿,我一眼就瞅出你这浏览器卡顿的根源了——你的删除数据逻辑里藏着个无限循环!让我给你拆解清楚:

问题核心分析

看你DelBoyData函数里这段代码:

let total = myChart.data.labels.length;
while (total >= 10) {
    myChart.data.labels.pop();
    myChart.data.datasets[0].data.pop();
}
chart.update();

这里有两个致命错误:

  1. 循环条件永远成立:你一开始把total赋值为当前标签的长度,但在循环里执行pop()删除数据后,total的数值压根没更新——它一直保持着初始的那个≥10的数,导致while循环会无限跑下去,不停删数据直到浏览器扛不住卡顿。
  2. 变量名写错了:最后一行的chart.update()应该是myChart.update(),你定义的图表实例是myChart,写错变量名会导致图表更新失败。

另外提个小细节:你的RodneyData函数每次添加的都是固定的pCount,如果是要获取实时数据,应该用AJAX返回的data来填充,不然图表数据会全是重复值哦。

修正后的完整代码

我把问题都修复了,还加了点小优化,你直接用就行:

var pCount = <?php echo $p; ?>;
var pMax = <?php echo $pm; ?>;
var ctx_live = document.getElementById("players");
var myChart = new Chart(ctx_live, {
    type: 'bar',
    data: {
        labels: [],
        datasets: [{
            data: [],
            borderWidth: 1,
            borderColor:'#00c0ef',
            label: 'liveCount',
        }]
    },
    options: {
        responsive: true,
        title: {
            display: true,
            text: "",
        },
        legend: {
            display: false
        },
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero: true,
                    max: pMax,
                    stepSize: 1
                }
            }]
        }
    }
});
var RodneyData = function() {
    $.ajax({
        success: function(data) {
            // 改成用AJAX返回的data,而非固定的pCount,保证数据实时性
            myChart.data.labels.push(data);
            myChart.data.datasets[0].data.push(data);
            myChart.update();
        }
    });
};
var DelBoyData = function() {
    $.ajax({
        success: function(data) {
            // 修正:每次循环都检查当前的实际长度,而非固定值
            while (myChart.data.labels.length >= 10) {
                // 用shift()删除最早的数据,这样能保留最新的10条(如果用pop是删最新的,按需调整)
                myChart.data.labels.shift();
                myChart.data.datasets[0].data.shift();
            }
            // 修正变量名,用正确的myChart实例更新
            myChart.update();
        }
    });
};
setInterval(RodneyData, 3000);
setInterval(DelBoyData, 3000);

额外优化小建议

  • 可以把添加和删除数据的逻辑合并到同一个AJAX请求里,避免两个setInterval可能带来的时序混乱(比如添加和删除的时机不同步)。
  • 如果你的AJAX请求是获取同一组数据,没必要分开两次请求,一次请求完同时处理添加和截断会更高效。

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

火山引擎 最新活动