I'm performing drawing operations on canvas. The best way to calculate cursor position relative to canvase top left corner is, in my opinion, usage of .getBoundingClientRect():
HTMLCanvasElement.prototype.relativeCoords = function(event) {
var x,y;
//This is the current screen rectangle of canvas
var rect = this.getBoundingClientRect();
//Recalculate mouse offsets to relative offsets
x = event.clientX - rect.x;
y = event.clientY - rect.y;
//Debug
console.log("x(",x,") = event.clientX(",event.clientX,") - rect.x(",rect.x,")");
//Return as array
return [x,y];
}
I see nothing wrong with this code and it works in firefox. Test it.
In google chrome however, my debug line prints this:
x(
NaN) = event.clientX(166) - rect.x(undefined)
What am I doing wrong? Is this not according to the specifications?
Edit: seems my code follows W3C:
From the specs:
getBoundingClientRect()
The
getBoundingClientRect()method, when invoked, must return the result of the following algorithm:
Let list be the result of invoking
getClientRects()on the same element this method was invoked on.If the list is empty return a
DOMRectobject whosex,y,widthandheightmembers are zero.Otherwise, return a
DOMRectobject describing the smallest rectangle that includes the first rectangle in list and all of the remaining rectangles of which the height or width is not zero.
DOMRect
interface DOMRect : DOMRectReadOnly {
inherit attribute unrestricted double x;
inherit attribute unrestricted double y;
inherit attribute unrestricted double width;
inherit attribute unrestricted double height;
};