У меня есть объект canvas HTML5, который несколько раз использует метод addEventListener()
, чтобы иметь возможность реагировать на события мыши. Используемые строки выглядят так:
canvas.addEventListener("mousemove", this.checkMouseLocation.bind(this, this.inputs), false);
Все это работает отлично, если холст находится непосредственно внутри тела документа или в div. Однако он не работает внутри таблицы. Как только холст помещен туда, все события мыши перестают стрелять.
После чтения Событие мыши не запускается на холсте html5, я решил попробовать это решение - добавить свойство style="-webkit-transform: translate3d(0, 0, 0);"
к моему холсту. Это устранило проблему в Firefox, но в Chrome все еще не обращает внимания на мышь.
Есть ли у кого-нибудь идеи? Лучше всего предположить, что это имеет какое-то отношение к координатам мыши, хотя я не мог сказать вам, как это сделать.
Спасибо.
Я нашел ответ для всех, кто идет за мной.
Мышцы не были полностью смешаны - они все еще продолжались. Однако координаты мыши и x были полностью отключены до такой степени, что они не отвечали на них.
Я вычислял координаты мыши, вычитая смещение холста из местоположения мыши, например:
var x = event.pageX - canvas.offsetLeft;
var y = event.pageY - canvas.offsetTop;
К сожалению, это не является надежным, поскольку смещения объекта canvas
не всегда относятся к телу документа. Когда внутри таблицы они были относительно <td>
, внутри canvas
. Таким образом, координаты были удалены, что делает объект canvas
совершенно неактивным для мыши.
Я заменил эти строки такими:
var rect = canvas.getBoundingClientRect();
var x = event.clientX - rect.left;
var y = event.clientY - rect.top;
Это кажется немного kludgey, так как боги знают только, насколько эффективна функция getBoundingClientRect()
, и это означает, что я имею дело с координатами с плавающей запятой, а не с целыми координатами. Но вычисляемые x и y являются точными, и что более важно.
Я надеюсь, что это поможет кому-то еще по дороге.
.offsetLeft
и .offsetTop
, даже если последние выглядят как фиксированные свойства, они фактически пересчитываются точно так же, как gBCR. (конечно, могут быть некоторые минимальные различия, поскольку он создает DOMRect, но не о чем беспокоиться, если вы не вызываете его 10 тысяч раз в цикле.
<canvas>
внутри<table>
? Элемент table используется для представления табличных данных, и я представляю, что не так много ситуаций, когда элемент canvas будет считаться табличными данными.