this.gCurrentMouseX = evt.x;
Вы не хотите использовать .x
. Он не существует для стандартного объекта DOM MouseEvent (именно поэтому в Firefox его нет), и даже в IE это обычно не то, что вам нужно. Это относительно ближайшего расположенного предка, где значение «позиционированного» может варьироваться. Как правило, лучше получить координаты относительно страницы.
К сожалению, свойство pageX
, которое дает вам это, также не является стандартным свойством Event, поэтому, хотя оно поддерживается IE9, Firefox, WebKit и т. Д., Вы не можете гарантировать его наличие. Вместо этого вы можете использовать clientX
, что является стандартным, но относительно окна просмотра, поэтому, чтобы исправить его в случае прокрутки окна просмотра, вы должны добавить scrollLeft
из documentElement
(если вы не в IE Режим Quirks, в этом случае вместо этого body
... не будьте в режиме Quirks!).
(Другое стандартное свойство позиционирования в MouseEvent - screenX
, но это в значительной степени бесполезно, за исключением размещения всплывающих окон. Существуют также нестандартные свойства offsetX
и layerX
, которые еще более бесполезны.)
if (window.event) {
Лучше сначала проверить на стандарт (evt
не равен undefined
), и отступить только до window.event
для IE <9. В противном случае вы можете не получить того, что ожидаете, в браузерах, которые поддерживают оба, или там, где есть что-то еще (например, переменная или элемент), определенное как <code>event.
// Update mouse coords
this.gUpdateMousePos = function(evt) {
if (evt===undefined) evt= window.event;
if ('pageX' in evt) {
this.gCurrentMouseX = evt.pageX;
this.gCurrentMouseY = evt.pageY;
} else {
this.gCurrentMouseX = evt.clientX+document.documentElement.scrollLeft;
this.gCurrentMouseY = evt.clientY+document.documentElement.scrollTop;
}
}
Это дает вам относительные координаты страницы. Если вы хотите рассчитать положение относительно определенного элемента, вам нужно вычесть относительные к странице координаты этого элемента, как правило, используя цикл offsetLeft
/ offsetParent
. Хотя там также есть много потенциальных проблем с браузером. Вздох. Рамки могут помочь здесь. Хотя, честно говоря, большинство из них все еще сталкиваются с некоторыми из самых ужасных угловых случаев.
(Было бы замечательно, если бы какая-нибудь полезная организация указала MouseEvent pageX
/ pageY
как стандартную и добавила элемент / view pageLeft
/ pageTop
свойства для соответствия ... Я могу мечтать .. .)