我收到错误Uncaught TypeError: Cannot read property 'getContext' of null
并且文件中的重要部分是......我想知道因为game.js在下面的目录中,所以找不到画布?我该怎么办?
./ index.html的:
<canvas id="canvas" width="640" height="480"></canvas>
./的javascript / game.js:
var Grid = function(width, height) {
...
this.draw = function() {
var canvas = document.getElementById("canvas");
if(canvas.getContext) {
var context = canvas.getContext("2d");
for(var i = 0; i < width; i++) {
for(var j = 0; j < height; j++) {
if(isLive(i, j)) {
context.fillStyle = "lightblue";
}
else {
context.fillStyle = "yellowgreen";
}
context.fillRect(i*15, j*15, 14, 14);
}
}
}
}
}
答案 0 :(得分:59)
我猜问题是在加载html之前你的js运行。
如果您使用的是jquery,则可以使用文档就绪函数来包装代码:
$(function() {
var Grid = function(width, height) {
// codes...
}
});
或者只是将你的js放在<canvas>
之后。
答案 1 :(得分:8)
将您的JavaScript放在标记"<canvas></canvas>"
答案 2 :(得分:7)
你不必包含JQuery。
在index.html中:
<canvas id="canvas" width="640" height="480"></canvas><script src="javascript/game.js">
这应该没有JQuery ...
编辑:您应该将脚本标记放在正文标记中...
答案 3 :(得分:2)
我假设您在<head>
标记内声明了JS文件,以便使其像标准一样保持一致,然后在JS中确保在加载页面后 初始化画布:
window.onload = function () {
var myCanvas = document.getElementById('canvas');
var ctx = myCanvas.getContext('2d');
}
不需要仅使用jQuery来初始化画布,这很明显,全世界大多数程序员都不必要地使用它,对此,可以接受的答案就是一个探究。
答案 4 :(得分:1)
你应该在你的html文件中加入javascript标签。
因为浏览器根据html流程加载您的网页,您应该将您的javascript文件<script src="javascript/game.js">
放在<canvas>
元素标记之后。否则,如果你把你的javascript放在html.Browser的头文件中,首先加载脚本,但它找不到画布。所以你的画布不起作用。
答案 5 :(得分:1)
以这种方式编写代码......
<canvas id="canvas" width="640" height="480"></canvas>
<script>
var Grid = function(width, height) {
...
this.draw = function() {
var canvas = document.getElementById("canvas");
if(canvas.getContext) {
var context = canvas.getContext("2d");
for(var i = 0; i < width; i++) {
for(var j = 0; j < height; j++) {
if(isLive(i, j)) {
context.fillStyle = "lightblue";
}
else {
context.fillStyle = "yellowgreen";
}
context.fillRect(i*15, j*15, 14, 14);
}
}
}
}
}
首先编写canvas标签,然后编写脚本标签。并在正文中编写脚本标记。
答案 6 :(得分:0)
您只需要在{canvas>之后放置<script src='./javascript/game.js'></script>
。
因为浏览器在画布之前找不到您的JavaScript文件
答案 7 :(得分:0)
这似乎有些矫kill过正,但是如果在另一种情况下,您试图从js加载画布(例如我正在做的事情),则可以使用setInterval函数和if语句来不断检查画布是否已加载。 / p>
//set up the interval
var thisInterval = setInterval(function{
//this if statment checks if the id "thisCanvas" is linked to something
if(document.getElementById("thisCanvas") != null){
//do what you want
//clearInterval() will remove the interval if you have given your interval a name.
clearInterval(thisInterval)
}
//the 500 means that you will loop through this every 500 milliseconds (1/2 a second)
},500)
(在此示例中,我尝试加载的画布的ID为“ thisCanvas”)