Я выполняю операции рисования на холсте. На мой взгляд, лучший способ вычислить положение курсора относительно верхнего левого угла холста — это использовать .getBoundingClientRect()
:
HTMLCanvasElement.prototype.relativeCoords = function(event) {
var x,y;
//This is the current screen rectangle of canvas
var rect = this.getBoundingClientRect();
//Recalculate mouse offsets to relative offsets
x = event.clientX - rect.x;
y = event.clientY - rect.y;
//Debug
console.log("x(",x,") = event.clientX(",event.clientX,") - rect.x(",rect.x,")");
//Return as array
return [x,y];
}
Я не вижу ничего плохого в этом коде, и он работает в Firefox. Протестируйте.
Однако в google chrome моя строка отладки печатает это:
х(
NaN
) = event.clientX(166
) - rect.x(undefined
)
Что я делаю не так? Разве это не соответствует спецификациям?
Редактировать: кажется, что мой код следует W3C:
Из спецификаций:
getBoundingClientRect()
Метод
getBoundingClientRect()
при вызове должен возвращать результат следующего алгоритма:
Пусть list будет результатом вызова
getClientRects()
для того же элемента, для которого был вызван этот метод.Если список пуст, верните объект
DOMRect
, члены которогоx
,y
,width
иheight
равны нулю.В противном случае вернуть объект
DOMRect
, описывающий наименьший прямоугольник, включающий первый прямоугольник в списке и все остальные прямоугольники, высота или ширина которых не равны нулю.
DOMRect
interface DOMRect : DOMRectReadOnly {
inherit attribute unrestricted double x;
inherit attribute unrestricted double y;
inherit attribute unrestricted double width;
inherit attribute unrestricted double height;
};
x
. Я сказал, что в Firefox это работает. И да, я проверил это в firebug, а не в документах - может быть, проблема в этом. - person Tomáš Zato - Reinstate Monica   schedule 27.11.2014x
свойство. - person Tomáš Zato - Reinstate Monica   schedule 27.11.2014