Я использую этот код и он отлично работает для меня. После добавления события холста мыши имеют два новых свойства: canvasX и canvasY, которые правильно отображаются. Сразу после того, как вы получили элемент canvas, не забудьте вызвать canvas.extendMouseEvents(), и вы находитесь в бизнесе.
HTMLCanvasElement.prototype.extendMouseEvents = function() {
this.mapMouseEvent = function(ev) {
var r = this.getBoundingClientRect();
ev.canvasX = ev.pageX - r.left;
ev.canvasY = ev.pageY - r.top;
};
this.addEventListener("mousemove", this.mapMouseEvent);
this.addEventListener("click", this.mapMouseEvent);
this.addEventListener("contextmenu", this.mapMouseEvent);
this.addEventListener("dblclick", this.mapMouseEvent);
this.addEventListener("mousedown", this.mapMouseEvent);
this.addEventListener("mouseenter", this.mapMouseEvent);
this.addEventListener("mouseleave", this.mapMouseEvent);
this.addEventListener("mouseover", this.mapMouseEvent);
this.addEventListener("mouseout", this.mapMouseEvent);
this.addEventListener("mouseup", this.mapMouseEvent);
}
+1 Чтобы получить смещение, если вам не нужно поддерживать старые браузеры, я предлагаю использовать 'element.getBoundingClientRect();', который возвращает объект с верхней левой нижней части правильные свойства – UpTheCreek