エラーが表示される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);
}
}
}
}
}
問題は、htmlがロードされる前にjsが実行されることだと思います。
Jqueryを使用している場合、document ready関数を使用してコードをラップできます。
$(function() {
var Grid = function(width, height) {
// codes...
}
});
または、単に<canvas>
の後にjsを配置します。
JavaScriptコードをタグの後に挿入<canvas></canvas>
JQueryを含める必要はありません。
index.html:<canvas id="canvas" width="640" height="480"></canvas><script src="javascript/game.js">
これはJQueryなしで機能するはずです...
編集:スクリプトタグをbodyタグに配置する必要があります...
この方法でコードを書く...
<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タグを記述してから、scriptタグを記述します。そして、スクリプトタグを本文に記述します。
Htmlファイルにjavascriptタグを配置する必要があります。ブラウザはhtmlフローに従ってウェブページを読み込むため、javascript file<script src="javascript/game.js">
後に <canvas>
elementタグ。それ以外の場合、java.scriptをhtml.Browserロードスクリプトのヘッダーに最初に配置しても、キャンバスが見つからない場合。そのため、キャンバスは機能しません。
これはやり過ぎのように思えるかもしれませんが、別のケースで(私がやっているように)jsからキャンバスをロードしようとした場合、setInterval関数とifステートメントを使用して、キャンバスがロードされたかどうかを常に確認できます。
//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」です)
Put<script src='./javascript/game.js'></script>
<canvas>の後。ブラウザーがキャンバスの前にjavascriptファイルを見つけられないため