【发布时间】:2020-08-17 01:53:34
【问题描述】:
大家好,我是 JS 新手,还在学习。现在已经不碍事了,我正在尝试在单击按钮时创建一个 pdf。但是,我收到错误“Uncaught TypeError: Cannot read property 'getContext' of null”。
我正在创建两个画布。第一个工作正常,但我不明白为什么它不适用于第二个。我已经搜索了错误并了解到它通常发生在代码在 html 加载之前运行时。但是,我的脚本代码位于正文的末尾。即使在引用图像而不是第一个图像之前,第二个 getContext('2d') 也会发生错误。
function cPdf() {
// The code below creates a new canvas to draw the chart
//****************************************************************
var conHeight = document.getElementById("chart-container").offsetHeight;
var conWidth = document.getElementById("chart-container").offsetWidth;
var pdfCanvas = document.createElement("canvas");
pdfCanvas.id = "canvasPdf";
pdfCanvas.width = conWidth;
pdfCanvas.height = conHeight;
var pdfctx = pdfCanvas.getContext("2d");
var canvasHeight = document.getElementById("chart").offsetHeight;
var canvasWidth = document.getElementById("chart").offsetWidth;
pdfctx.drawImage(document.getElementById("chart"), 0, 0, canvasWidth, canvasHeight);
//*****************************************************************
// Chart copied on canvas and ready to be added to the pdf
// The code below creates a new canvas to draw the logo
//****************************************************************
var myCanvas = document.createElement("canvas");
myCanvas.setAttribute("id", "logoCanvas");
myCanvas.width = 250;
myCanvas.height = 150;
//
var c = document.getElementById("logoCanvas");
var ctx = c.getContext("2d");
// var img = document.getElementById("logo");
// ctx.drawImage(img, 0, 0);
//*****************************************************************
// logo copied on canvas and ready to be added to the pdf
var pdf = new jsPDF('p', 'mm', "A4");
pdf.setFont("Lucida Grande");
pdf.addImage(pdfCanvas, 'PNG', 35, 10);
source = document.getElementById("oTable");
margins = {
top: 80,
bottom: 20,
left: 20,
width: 400
};
pdf.fromHTML(
source,
margins.left,
margins.top, {
// y coord
width: margins.width;
},
function () {
pdf.save("Test.pdf");
},
margins
);
}
'''
【问题讨论】:
-
何时调用
cPdf? dom 准备好了吗? -
document.getElementById("logoCanvas")不起作用。你刚刚创建了它,但没有把它放到 DOM 中。为什么还要那样做?你已经有了你的画布的参考;就做var ctx = myCanvas.getContext("2d");。你用pdfCanvas做对了。 -
嗯,对了,所以我需要先将画布添加到 DOM,然后才能使用
getElementByID。与var ctx = myCanvas.getContext("2d");一起工作正常。谢谢@user4642212
标签: javascript canvas jspdf