Вы пытаетесь использовать событие load
для элемента main
.Только некоторые элементы (например, body
) поддерживают событие load
.
Вместо этого просто убедитесь, что ваш тег script
находится в конце документа, непосредственно перед закрывающим тегом </body>
, иЗвоните MyCanvasContext.start();
напрямую:
let canvas = {
"myCanvas" : document.querySelector("#myCanvas")
};
let myCan = canvas.myCanvas;
class MyCanvasContext {
static start() {
if (myCan.getContext) {
this.ctx = myCan.getContext('2d');
this.draw();
}
else {
console.write("Update");
}
}
static draw() {
this.ctx.fillStyle = 'rgb(200, 0, 0)';
this.ctx.fillRect(10, 10, 50, 50);
this.ctx.fillStyle = 'rgba(0, 0, 200, 0.5)';
this.ctx.fillRect(30, 30, 50, 50);
}
}
MyCanvasContext.start();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Canvas</title>
</head>
<body>
<main>
<canvas id="myCanvas" width="150" height="150"></canvas>
</main>
</body>
</html>
Или, если вы действительно хотите дождаться события load
(которое ожидает все ресурсы перед запуском, включая все изображения и т. Д.), Используйтесобытие load
в window
:
window.addEventListener("load", () => { MyCanvasContext.start(); });
Примечание: использование синтаксиса class
не очень полезно, если все ваши методы static
, и вы нене сможет обработать более одного холста вашим классом.Вместо этого вы можете использовать методы-прототипы, передавая холст в качестве параметра конструкции, например:
class MyCanvasContext {
constructor(myCan) {
if (!myCan.getContext) {
throw new Error("myCan must be a canvas element");
}
this.myCan = myCan;
this.ctx = this.myCan.getContext("2d");
}
start() {
this.draw();
}
draw() {
this.ctx.fillStyle = 'rgb(200, 0, 0)';
this.ctx.fillRect(10, 10, 50, 50);
this.ctx.fillStyle = 'rgba(0, 0, 200, 0.5)';
this.ctx.fillRect(30, 30, 50, 50);
}
}
const mc = new MyCanvasContext(document.getElementById("myCanvas"));
mc.start();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Canvas</title>
</head>
<body>
<main>
<canvas id="myCanvas" width="150" height="150"></canvas>
</main>
</body>
</html>