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

调用Canvg方法时出现'Uncaught TypeError'错误的技术求助

解决Canvg调用时的"Cannot read properties of undefined (reading 'documentElement')"错误

错误根源

  • d3.select('svg')返回的是d3选择集对象,不是原生SVG DOM元素,直接访问outerHtml会得到undefined
  • 属性名拼写错误:正确属性是outerHTML(大写H),不是outerHtml
  • Canvg接收到无效的undefined数据后,内部解析逻辑会触发documentElement读取失败的错误

修正后的代码方案

方案1:获取原生SVG元素并正确提取HTML字符串

svgToPng(svg, callback){
    let canvas = document.createElement('canvas');
    let ctx = canvas.getContext('2d');
    // 确保svg是原生DOM元素,提取正确的outerHTML
    let data = svg.outerHTML;
    canvg(canvas, data);
    callback(canvas);
},

download(){
    let el = d3.select('svg');
    // 从d3选择集中获取原生DOM元素
    this.svgToPng(el.node(), function(canvas) {
        let img = canvas.toDataURL("image/png");
        let doc = new jsPDF('l', 'mm', [50, 120]);
        doc.addImage(img, 'PNG', 0, 0, 120, 50);
        doc.save('wordcloud.pdf');
    });
}

方案2:直接传入原生SVG DOM元素给Canvg

Canvg 1.x版本支持直接接收SVG DOM元素作为参数,无需转成字符串:

svgToPng(svg, callback){
    let canvas = document.createElement('canvas');
    let ctx = canvas.getContext('2d');
    // 直接传入原生SVG元素
    canvg(canvas, svg);
    callback(canvas);
},

download(){
    let el = d3.select('svg');
    this.svgToPng(el.node(), function(canvas) {
        let img = canvas.toDataURL("image/png");
        let doc = new jsPDF('l', 'mm', [50, 120]);
        doc.addImage(img, 'PNG', 0, 0, 120, 50);
        doc.save('wordcloud.pdf');
    });
}

额外注意事项

  • 确认SVG元素结构完整,没有缺失根标签的情况
  • 你当前使用的Canvg 1.5版本兼容上述两种传参方式,无需切换版本

内容的提问来源于stack exchange,提问作者jop frenken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:20:36