There's a bug in Musa's solution: think what happens if e.offsetX === 0 and e.layerX === undefined...
var x = e.offsetX || e.layerX; // x is now undefined!
A more robust version is as follows:
var x = e.hasOwnProperty('offsetX') ? e.offsetX : e.layerX;
var y = e.hasOwnProperty('offsetY') ? e.offsetY : e.layerY;
Or, because we can assume that if offsetX is defined, offsetY will be too:
var hasOffset = e.hasOwnProperty('offsetX'),
x = hasOffset ? e.offsetX : e.layerX,
y = hasOffset ? e.offsetY : e.layerY;