From 52a245e044e1af2e4c85eaf2fdd0bf92e5d5418b Mon Sep 17 00:00:00 2001 From: hz4th_coder Date: Wed, 19 Aug 2026 12:27:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8F=8C=E5=9B=BE?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E9=A2=84=E8=A7=88/=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E4=B8=BA=E7=99=BD=E5=9B=BE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:renderOne 里 resolve(cvs) 后立即 chart.dispose(),Promise 微任务在 dispose 之后才执行,此时 echarts 已清空 canvas 内容,合并出来全是白图。 默认主题下因白底白图不易察觉(内容其实一直没画上)。 修复:resolve 前先把内容复制到独立 canvas 副本再 dispose,保证合并时 拿到的是有效像素。深色主题下验证通过(深色背景+彩色内容均正常)。 --- app.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index ae34fa5..fe05cd3 100644 --- a/app.js +++ b/app.js @@ -941,11 +941,18 @@ function generateCombine() { const chart = echarts.init(holder, null, { renderer: 'canvas' }); chart.setOption(option); setTimeout(() => { - const cvs = holder.querySelector('canvas'); - if (!cvs) { reject(new Error('子图渲染失败')); return; } - resolve(cvs); + const srcCvs = holder.querySelector('canvas'); + if (!srcCvs) { reject(new Error('子图渲染失败')); return; } + // 关键:先把内容复制到独立 canvas 再 dispose。 + // 直接 resolve 原 canvas 的话,Promise 微任务在 chart.dispose() 之后才执行, + // 此时 canvas 内容已被 echarts 清空,合并出来就是白图。 + const copy = document.createElement('canvas'); + copy.width = srcCvs.width; + copy.height = srcCvs.height; + copy.getContext('2d').drawImage(srcCvs, 0, 0); chart.dispose(); holder.remove(); + resolve(copy); }, 80); });