J'utilise ce code et il fonctionne parfaitement pour moi. Une fois ajoutés, les événements de souris de canvas ont deux nouvelles propriétés: canvasX, et canvasY qui sont correctement mappés. Juste après avoir obtenu l'élément canvas, n'oubliez pas d'appeler canvas.extendMouseEvents() et vous êtes en affaires.
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 Pour obtenir le décalage, à moins que vous devez soutenir les anciens navigateurs, je suggère d'utiliser 'element.getBoundingClientRect();' qui retourne un objet avec fond en haut à gauche propriétés droite – UpTheCreek