@2astalavista評判のためにコメントできないので、これをここに入れますが、これを行うことは想定されていません。
私は受け入れられた答えを試しましたが、キャンバスの左/上に配置された他の要素からの問題のみを解決します。私にとっては、キャンバスの余白は考慮されていませんでした。私がそれを正しくやったかどうかはわかりません。また、Html 側のソリューションのアイデアも好きではありません。誰かが Html を変更し、"position: relative;" を忘れています。その結果、追跡がほとんど不可能なバグが発生します。
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;
複数のキャンバスを扱う場合はおそらくより良いでしょう。