Как определить истинную координату x y в событии касания (или событии мыши) с помощью JavaScript?
Я работал над сенсорными событиями и немного работал, пока холст не начинался в верхнем левом углу. Как только я добавляю что-либо перед этим, сообщаемое событие смещается на позицию холста.
Я определяю это, рисуя круг вокруг места касания. Круг всегда смещен на смещение холста от верхнего левого угла экрана.
Глядя на событие для сенсорного запуска, я вижу, что доступна страница Y (в chrome, с использованием отладки по USB). Но когда я гуглю это, мне кажется, что это не является частью стандарта, и, кажется, есть некоторое утверждение, что это может быть обесценено (хотя я не могу выяснить, так или иначе).
Итак, мой вопрос: каков лучший кросс-браузерный метод для решения этой проблемы (основные проблемы - это Safari и Chrome, т. Е. Неплохо бы иметь webkit, firefox)?
Та же проблема возникает для событий мыши, для которых я создалJSFiddle из проблемы, Однако я не уверен, что одинаковые атрибуты доступны для событий мыши и сенсорных событий.
Должен заметить, я знаю, что могу жестко запрограммировать смещение, и проблема решена, однако я ищу решение, которое использует имеющуюся информацию, не требуя какого-либо аппаратного кода, специфичного для моего HTML.
Чтобы воссоздать JSFiddle, HTML, CSS и Javascript:
<div class="title"></div>
<div class="container">
<canvas id="myCanvas"></canvas>
</div>
CSS:
body {
background-color: #ff0000;
margin: 0px;
}
canvas {
display:block;
position:absolute;
width:100%;
height:100%;
background-color:#000;
}
.title {
position:absolute;
top:0px;
left:0px;
width: 100%;
height: 40px;
background-color: #888;
}
.container {
width:auto;
text-align:center;
background-color:#777;
width:100%;
position:absolute;
top:40px;
left:0px;
bottom:0px;
}
Javascript:
var onMouseDown = function(e) {
draw(document.getElementById('myCanvas').getContext('2d'), e.clientX, e.clientY);
}
$(function () {
document.getElementById('myCanvas').addEventListener('mousedown', onMouseDown, false);
});
function draw(ctx, x, y) {
ctx.canvas.width = ctx.canvas.offsetWidth;
ctx.canvas.height = ctx.canvas.offsetHeight;
var radius = 50;
var lineWidth = 15;
var r = 255;
var g = 75;
var b = 75;
var a75 = 0.05;
var adj = Math.abs(lineWidth / 2);
rad = radius + adj;
var stop1 = (rad - lineWidth) / rad;
var stop2 = 0;
var stop3 = stop1 + (1 - stop1) / 2;
var stop4 = 0;
var stop5 = 1;
stop2 = stop3 - (stop3 - stop1) / 2;
stop4 = stop3 + (stop5 - stop3) / 2;
var radgrad = ctx.createRadialGradient(x, y, 0, x, y, rad);
radgrad.addColorStop(stop1, 'rgba(' + r + ',' + g + ',' + b + ', 0)');
radgrad.addColorStop(stop2, 'rgba(' + r + ',' + g + ',' + b + ', .4)');
radgrad.addColorStop(stop3, 'rgba(' + r + ',' + g + ',' + b + ', 1)');
radgrad.addColorStop(stop4, 'rgba(' + r + ',' + g + ',' + b + ', .4)');
radgrad.addColorStop(stop5, 'rgba(' + r + ',' + g + ',' + b + ', 0)');
ctx.fillStyle = radgrad;
ctx.arc(x, y, rad, 0, 2 * Math.PI, true);
ctx.fill();
}