如何获得在画布元素上单击鼠标的坐标?

时间:2020-03-05 18:51:11  来源:igfitidea点击:

将click事件处理程序添加到canvas元素(将返回click的x和y坐标)(相对于canvas元素)的最简单方法是什么?

不需要旧版浏览器兼容性,Safari,Opera和Firefox都可以。

解决方案

回答

嘿,这是在dojo中,只是因为这就是我已经在一个项目中使用的代码。

如何将其转换回非dojo vanilla JavaScript应该是相当明显的。

function onMouseClick(e) {
      var x = e.clientX;
      var y = e.clientY;
  }
  var canvas = dojo.byId(canvasId);
  dojo.connect(canvas,"click",onMouseClick);

希望能有所帮助。

回答

进行坐标转换时要小心; click事件中返回了多个非跨浏览器值。如果滚动浏览器窗口(在Firefox 3.5和Chrome 3.0中验证),仅使用clientX和clientY是不够的。

这篇古怪的模式文章提供了一个更正确的功能,可以使用pageX或者pageY或者将clientX与document.body.scrollLeft结合使用,以及将clientY与document.body.scrollTop结合使用,以计算相对于文档原点的单击坐标。

更新:此外,offsetLeft和offsetTop是相对于元素的填充大小,而不是内部大小。应用padding:样式的画布不会将其内容区域的左上角报告为offsetLeft。有多种解决方案可以解决此问题。最简单的方法可能是清除画布本身上的所有边框,填充等样式,然后将它们应用于包含画布的盒子。

回答

如此处所述:

var x;
var y;
if (e.pageX || e.pageY) { 
  x = e.pageX;
  y = e.pageY;
}
else { 
  x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; 
  y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; 
} 
x -= gCanvasElement.offsetLeft;
y -= gCanvasElement.offsetTop;

对我来说工作得很好。