Firefox does not support offsetX, offsetY so we have to use layerX, layerY amd opera does not support layerX, layerY, so we have to use offsetX, offsetY.
<html>
<head>
<meta charset="utf-8">
<script src="script.js"></script>
</head>
<body>
<canvas id="myCanvas"></canvas>
</body>
</html>
//script.js
window.onload = function () {
var canvas = document.querySelector('#myCanvas'),
ctx = canvas.getContext("2d");
//draw something
ctx.fillStyle = "#000000";
ctx.strokeStyle = "#000000";
ctx.beginPath();
ctx.rect(100, 100, 300, 100); //x, y, width, height
ctx.fill();
ctx.stroke();
ctx.closePath();
//listen for click event
canvas.addEventListener("click", function (e) {
var cX, //will contain clicked x co-ordinate
cY; //will contain clicked y y co-ordinate
if (e.offsetX == null) { //in case of Firefox
cX = e.layerX;
cY = e.layerY;
} else { //in case of Opera layerX does not work, use offsetX instead
cX = e.offsetX;
cY = e.offsetY;
}
console.log("clicked at: " + cX + " " + cY);
}, true);
}