Reputation: 267
var canvas=document.getElementById('canvas');
var ctx=canvas.getContext("2d");
var mouseX=0;
var mouseY=0;
var canvasPos=getPosition(canvas);
ctx.addEventListener("mousemove",setMousePosition,false);
function getPosition(e1) {
var xPosition = 0;
var yPosition = 0;
while (e1) {
xPosition += (e1.offsetLeft - e1.scrollLeft + e1.clientLeft);
yPosition += (e1.offsetTop - e1.scrollTop + e1.clientTop);
e1 = e1.offsetParent;
}
return { x: xPosition, y: yPosition };
}
function setMousePosition(e) {
mouseX = e.clientX - canvasPos.x;
mouseY = e.clientY - canvasPos.y;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
ctx.arc(mouseX, mouseY, 50, 0, 2 * Math.PI, true);
ctx.fillStyle = "#FF6A6A";
ctx.fill();
ctx.closePath();
}
function getPosition(e1) {
var xPosition=0;
var yPosition=0;
while(e1) {
xPosition+=(e1.offsetLeft-e1.scrollLeft+e1.clientLeft);
yPosition+=(e1.offsetTop-e1.scrollTop+e1.clientTop);
e1=e1.offsetParent;
}
return {
x: xPosition,
y: yPosition
};
}
<canvas id="canvas"></canvas>
The goal is for a canvas element to follow the mouse movement. My attempt is pasted above. I tried retrieving the exact mouse coordinates and used it to re-draw the element. I don't seem to be getting any output, only a blank canvas. Any help is appreciated.
Upvotes: 0
Views: 53
Reputation: 16547
You've to add event listener to canvas
not to its context
var canvas=document.getElementById('canvas');
var ctx=canvas.getContext("2d");
var mouseX=0;
var mouseY=0;
var canvasPos=getPosition(canvas);
canvas.addEventListener("mousemove",setMousePosition,false); // <-- this
function getPosition(e1) {
var xPosition = 0;
var yPosition = 0;
while (e1) {
xPosition += (e1.offsetLeft - e1.scrollLeft + e1.clientLeft);
yPosition += (e1.offsetTop - e1.scrollTop + e1.clientTop);
e1 = e1.offsetParent;
}
return { x: xPosition, y: yPosition };
}
function setMousePosition(e) {
mouseX = e.clientX - canvasPos.x;
mouseY = e.clientY - canvasPos.y;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
ctx.arc(mouseX, mouseY, 50, 0, 2 * Math.PI, true);
ctx.fillStyle = "#FF6A6A";
ctx.fill();
ctx.closePath();
}
function getPosition(e1) {
var xPosition=0;
var yPosition=0;
while(e1) {
xPosition+=(e1.offsetLeft-e1.scrollLeft+e1.clientLeft);
yPosition+=(e1.offsetTop-e1.scrollTop+e1.clientTop);
e1=e1.offsetParent;
}
return {
x: xPosition,
y: yPosition
};
}
<canvas id="canvas"></canvas>
Upvotes: 1
Reputation: 1726
You had 2 typos:
var context...
ctx.addEventListener(...)
The: ctx.addEventListener()
is not possible because of the context has no events.
The canvas does have those.
var canvas=document.getElementById('canvas');
// edit from context to ctx
var ctx=canvas.getContext("2d");
var mouseX=0;
var mouseY=0;
var canvasPos=getPosition(canvas);
// edit ctx to canvas
canvas.addEventListener("mousemove",setMousePosition,false);
function getPosition(e1) {
var xPosition = 0;
var yPosition = 0;
while (e1) {
xPosition += (e1.offsetLeft - e1.scrollLeft + e1.clientLeft);
yPosition += (e1.offsetTop - e1.scrollTop + e1.clientTop);
e1 = e1.offsetParent;
}
return { x: xPosition, y: yPosition };
}
function setMousePosition(e) {
mouseX = e.clientX - canvasPos.x;
mouseY = e.clientY - canvasPos.y;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
ctx.arc(mouseX, mouseY, 50, 0, 2 * Math.PI, true);
ctx.fillStyle = "#FF6A6A";
ctx.fill();
ctx.closePath();
}
function getPosition(e1) {
var xPosition=0;
var yPosition=0;
while(e1) {
xPosition+=(e1.offsetLeft-e1.scrollLeft+e1.clientLeft);
yPosition+=(e1.offsetTop-e1.scrollTop+e1.clientTop);
e1=e1.offsetParent;
}
return {
x: xPosition,
y: yPosition
};
}
<canvas id="canvas"></canvas>
Upvotes: 1