Cannot read property 'getContext' of null, using canvas

JavascriptHtmlCanvas

Javascript Problem Overview


I get the error Uncaught TypeError: Cannot read property 'getContext' of null and the important parts in files are... I am wondering since game.js is in a directory below, it cannot find canvas? What should I do?

./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);
				}
			}
		}
	}
}

Javascript Solutions


Solution 1 - Javascript

I guess the problem is your js runs before the html is loaded.

If you are using jquery, you can use the document ready function to wrap your code:

$(function() {
    var Grid = function(width, height) {
        // codes...
    }
});

Or simply put your js after the <canvas>.

Solution 2 - Javascript

Put your JavaScript code after your tag <canvas></canvas>

Solution 3 - Javascript

You don't have to include JQuery.

In the index.html:
<canvas id="canvas" width="640" height="480"></canvas><script src="javascript/game.js"> This should work without JQuery...

Edit: You should put the script tag IN the body tag...

Solution 4 - Javascript

You should put javascript tag in your html file. because browser load your webpage according to html flow, you should put your javascript file<script src="javascript/game.js"> after the <canvas>element tag. otherwise,if you put your javascript in the header of html.Browser load script first but it doesn't find the canvas. So your canvas doesn't work.

Solution 5 - Javascript

Write code in this manner ...

<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);
                }
            }
        }
    }
 }

First write canvas tag and then write script tag. And write script tag in body.

Solution 6 - Javascript

You just need to put<script src='./javascript/game.js'></script> after your <canvas>. Because the browser don't find your javascript file before the canvas

Solution 7 - Javascript

I assume you have your JS file declared inside the <head> tag so it keeps it consistent, like standard, then in your JS make sure the canvas initialization is after the page is loaded:

window.onload = function () {
    var myCanvas = document.getElementById('canvas');
    var ctx = myCanvas.getContext('2d');
}

There is no need to use jQuery just to initialize a canvas, it's very evident most of the programmers all around the world use it unnecessarily and the accepted answer is a probe of that.

Solution 8 - Javascript

This might seem like overkill, but if in another case you were trying to load a canvas from js (like I am doing), you could use a setInterval function and an if statement to constantly check if the canvas has loaded.

//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)

(In this example the canvas I am trying to load has an id of "thisCanvas")

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKobiView Question on Stackoverflow
Solution 1 - JavascriptC. LeungView Answer on Stackoverflow
Solution 2 - JavascriptCrsCaballeroView Answer on Stackoverflow
Solution 3 - JavascriptPeterView Answer on Stackoverflow
Solution 4 - JavascriptSpook WongView Answer on Stackoverflow
Solution 5 - Javascriptuser5733024View Answer on Stackoverflow
Solution 6 - Javascriptdif mView Answer on Stackoverflow
Solution 7 - Javascriptuser2188550View Answer on Stackoverflow
Solution 8 - JavascriptDarrow HartmanView Answer on Stackoverflow