@2astalavista 由于声誉,我无法发表评论,所以我会把它放在这里,尽管我不应该这样做:
我尝试了接受的答案,但它只解决了位于画布左侧/上方的其他元素的问题。对我来说,它没有考虑画布的边距。我不知道我是否做得对。我也不喜欢 Html 侧面解决方案的想法。有人更改了 Html,忘记了“位置:相对;” 导致几乎无法追踪的错误。
我使用了 Nech 的解决方案,但注意到当我将元素放置在画布左侧或上方时它无法正常工作。它只考虑画布边距之类的东西。
我使用了以下代码,与 Chrome 部分相比,Firefox 部分的准确率仍然只有大约 95 - 99%。但它完成了工作:
function getEventX(event){
if (event.offsetX) {
return event.offsetX;
}
if (event.clientX) {
var currentElement = event.currentTarget;
var offsetLeft = currentElement.offsetLeft;
while(currentElement.parentElement && currentElement.parentElement.offsetLeft){
currentElement = currentElement.parentElement;
offsetLeft += currentElement.offsetLeft;
}
return event.clientX - offsetLeft;
}
return null;
};
function getEventY(event){
if (event.offsetY) {
return event.offsetY;
}
if (event.clientY) {
var currentElement = event.currentTarget;
var offsetTop = currentElement.offsetTop;
while(currentElement.parentElement && currentElement.parentElement.offsetTop){
currentElement = currentElement.parentElement;
offsetTop += currentElement.offsetTop;
}
return event.clientY - offsetTop;
}
return null;
};
我还删除了传递给函数的画布,您可以通过以下方式获取画布:
event.currentTarget;
处理多个画布时可能会更好。