Chart.js 柱状图数据不渲染的完整解决方案

云伟大大_9526

云伟大大_9526

2026-06-09

514人浏览

原创

Chart.js 柱状图数据不渲染的完整解决方案

Chart.js 柱状图空白无数据,主因是图表初始化早于 DOM 加载完成及异步 API 数据返回,导致 canvas 元素未就绪或 data 数组为空。本文提供三种可靠时机控制方案(window.onload、DOMContentLoaded、readystatechange),并修复原始代码中的关键错误。

chart.js 柱状图空白无数据,主因是图表初始化早于 dom 加载完成及异步 api 数据返回,导致 `canvas` 元素未就绪或 `data` 数组为空。本文提供三种可靠时机控制方案(`window.onload`、`domcontentloaded`、`readystatechange`),并修复原始代码中的关键错误。

在使用 Chart.js 渲染动态数据(如区块链矿池实时算力)时,一个常见却极易被忽视的问题是:图表实例在数据尚未获取完成前就被创建。原始代码中存在两个核心缺陷:

  1. 错误使用 document.onload(该属性不存在,应为 window.onload 或事件监听器);
  2. 图表初始化逻辑(new Chart(...))写在 fetch 外部,导致 columns 数组仍为空时即尝试绘图。

此外,API 响应字段名与代码中引用存在不一致(如 "Braiins Poo" 应为 "Braiins Pool"),需严格对齐。

ViiTor AI
ViiTor AI

ViiTor AI是一款面向视频翻译、配音、口型同步和多语言内容本地化的 AI 视频工具。

下载

✅ 推荐方案:使用 DOMContentLoaded(最精准、现代且高效)

DOMContentLoaded 在 HTML 文档完全加载并解析完毕后触发,不等待样式表、图片等资源,比 window.onload 更快,且确保 DOM 节点(如 )已可安全访问。

let columns = [];
const chartAPI = 'https://api.blockchain.info/pools?timespan=5days';

function renderChart(data) {
  const ctx = document.getElementById('chart');
  if (!ctx) {
    console.error('Canvas element with id "chart" not found.');
    return;
  }

  new Chart(ctx, {
    type: 'bar',
    data: {
      labels: [
        'AntPool', 'BTC M4', 'Foundry USA', 'ViaBTC', 'Unknown',
        'BTC.com', 'F2Pool', 'Binance Pool', 'Mara Pool', 'Poolin',
        'SBI Crypto', 'Ultimus', 'Braiins Pool'
      ],
      datasets: [{
        label: 'BTC Mining Pools (Miners Count)',
        data: data,
        backgroundColor: [
          '#36A2EB', '#FF6384', '#FFCE56', '#4BC0C0', '#9966FF',
          '#FF9F40', '#FF6384', '#C9CBCF', '#4BC0C0', '#FFCE56',
          '#36A2EB', '#9966FF', '#FF9F40'
        ],
        borderWidth: 1
      }]
    },
    options: {
      responsive: true,
      maintainAspectRatio: false,
      scales: {
        y: {
          beginAtZero: true,
          ticks: {
            precision: 0 // 整数显示
          }
        }
      },
      plugins: {
        legend: {
          position: 'top',
        },
        title: {
          display: true,
          text: 'Top BTC Mining Pools (Last 5 Days)'
        }
      }
    }
  });
}

function getData() {
  fetch(chartAPI)
    .then(res => {
      if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`);
      return res.json();
    })
    .then(apiData => {
      // ✅ 严格按 API 字段名取值,修正拼写错误(如 "Braiins Poo" → "Braiins Pool")
      columns = [
        apiData["AntPool"] || 0,
        apiData["BTC M4"] || 0,
        apiData["Foundry USA"] || 0,
        apiData["ViaBTC"] || 0,
        apiData["Unknown"] || 0,
        apiData["BTC.com"] || 0,
        apiData["F2Pool"] || 0,
        apiData["Binance Pool"] || 0,
        apiData["Mara Pool"] || 0,
        apiData["Poolin"] || 0,
        apiData["SBI Crypto"] || 0,
        apiData["Ultimus"] || 0,
        apiData["Braiins Pool"] || 0 // 修正此处
      ];
      renderChart(columns);
    })
    .catch(err => {
      console.error('Failed to load pool data:', err);
      // 可选:渲染空图表或错误提示
      renderChart(new Array(13).fill(0));
    });
}

// ✅ 正确绑定 DOM 就绪事件
document.addEventListener('DOMContentLoaded', getData);

⚠️ 注意事项与最佳实践

  • 必须引入 Chart.js 库:在 <script> 标签中添加 CDN 链接(放在你的 JS 文件之前):<pre class="brush:php;toolbar:false;"><script src="https://cdn.jsdelivr.net/npm/chart.js@4"></script>
  • HTML 结构验证:确保 存在且无重复 ID;建议为 canvas 设置显式宽高或通过 CSS 控制(推荐 style="height:400px; width:800px;" 并设 responsive: true)。
  • 错误防御:API 字段可能缺失(如某矿池暂无数据),使用 || 0 提供默认值,避免 undefined 导致图表崩溃。
  • 性能优化:若页面含多个图表,将 renderChart() 抽离为可复用函数,并传入配置对象。
  • 替代时机方案:
    • window.onload:兼容性最好,但会等待所有资源(图片、CSS),略慢;
    • document.onreadystatechange:需检查 readyState === 'complete',语义稍弱,现已较少使用。

✅ 总结

Chart.js 柱状图“有轴无柱”的根本原因在于执行时序错乱——图表初始化与数据获取未形成可靠依赖。通过将 new Chart() 移入 fetch.then() 回调,并采用 DOMContentLoaded 确保 DOM 就绪,即可彻底解决。同时注意字段名一致性、空值处理和资源加载顺序,即可稳定渲染真实区块链矿池数据。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

2023.10.23

3751

6

canva可画使用技巧汇总
canva可画使用技巧汇总

本专题汇集了PHP中文网精心整理的Canva可画新手使用技巧大全,专为零基础用户打造。无论你是想制作精美海报、PPT还是社交媒体配图,这里都有从注册登录、模板搜索到AI辅助设计、导出分享的全流程保姆级教程。通过深入浅出的图文指南,帮助你快速跨越设计门槛,轻松掌握Canva可画的实用操作,让每个人都能成为设计达人!

2026.05.19

224

21

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

60

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

40

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

40

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

40

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

40

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

240

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

160

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习