原代码
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>WebGL Demo</title>
<link rel="stylesheet" href="../webgl.css" type="text/css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.8.1/gl-matrix-min.js"
integrity="sha512-zhHQR0/H5SEBL3Wn6yYSaTTZej12z0hVZKOv3TwCUXT1z5qeqGcXJLLrbERYRScEDDpYIJhPC1fk31gqR783iQ=="
crossorigin="anonymous" defer>
</script>
<script type="text/javascript" src="./script/gl-matrix.js" ></script>
<script type="text/javascript" src="./script/webgl_demo.js" ></script>
</head>
<body>
<canvas id="glcanvas" width="640" height="480"></canvas>
</body>
</html>
出现了错误 Uncaught TypeError: canvas is null,对应位置的 js 代码为
const canvas = document.querySelector("#glcanvas");
const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
这里看上去是没有问题的,问题不在这里。
出现这个错误的原因是 script 在加载 canvas 之前执行了,把位置改一下就行了。
<body>
<canvas id="glcanvas" width="640" height="480"></canvas>
<script type="text/javascript" src="./script/webgl_demo.js" ></script>
</body>
进一步的解释,script 文件在事件发生前是不会访问任何内容的,但是把 script 文件放在 head,需要保证它在运行的时候没有节点依赖项。而这里有一个 #glcanvas。 最简单的方法就是把这一行放在body的底部。
如果你非要把所有 script 都写在 head 里的话,另一种方法是加上 defer
,来推迟脚本的加载。
<head>
<script type="text/javascript" src="./script/webgl_demo.js" defer></script>
</head>
网友评论