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();
这里有两个致命错误:
- 循环条件永远成立:你一开始把
total赋值为当前标签的长度,但在循环里执行pop()删除数据后,total的数值压根没更新——它一直保持着初始的那个≥10的数,导致while循环会无限跑下去,不停删数据直到浏览器扛不住卡顿。 - 变量名写错了:最后一行的
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




