Какой заменитель следует использовать для layerX/layerY, поскольку они устарели в webkit?

В chrome canary, layerX и layerY устарели, но что мы должны использовать вместо этого?

Я нашел offsetX, но он не работает с Firefox. Поэтому, чтобы получить layerX без предупреждения в webkit, я сделал это:

var x = evt.offsetX || evt.layerX,
    y = evt.offsetY || evt.layerY;

Но это кажется довольно сложным! Это действительно то, что мы должны сделать, чтобы заставить layerX работать во всех браузерах?

Ответ 1

Вот функция для вычисления layerX и layerY из события click:

function getOffset(evt) {
  var el = evt.target,
      x = 0,
      y = 0;

  while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) {
    x += el.offsetLeft - el.scrollLeft;
    y += el.offsetTop - el.scrollTop;
    el = el.offsetParent;
  }

  x = evt.clientX - x;
  y = evt.clientY - y;

  return { x: x, y: y };
}

Большое спасибо Stu Cox за указание двух функций, используемых для создания этого.

Ответ 2

Вы уверены, что layerX и layerY устарели?

По моему опыту они все еще существуют, главным образом потому, что связанные свойства offsetX и offsetY не реализованы в других браузерах:

В webkit и mozilla много обсуждений:

https://bugs.webkit.org/show_bug.cgi?id=21868 и https://bugzilla.mozilla.org/show_bug.cgi?id=674292 В двух словах, они оба немного неубедительны, удалять или нет, поэтому пока они не удалили его.

более поздние версии IE предоставляют псевдоним, который сопоставляет свойствам x и y (мне не разрешено размещать какие-либо дополнительные ссылки путем из-за отсутствия "репутации" ).

Ответ 3

Единственными разумными кросс-браузерными способами определения положения мыши являются clientX/clientY (относительно окна), screenX/screenY (относительно всего экрана) и pageX/pageY (относительно документа, но не поддерживается в IE8 и ниже).

Quirksmode предлагает это для стандартизации относительно значения документа:

function doSomething(e) {
    var posx = 0;
    var posy = 0;
    if (!e) var e = window.event;
    if (e.pageX || e.pageY)     {
        posx = e.pageX;
        posy = e.pageY;
    }
    else if (e.clientX || e.clientY)     {
        posx = e.clientX + document.body.scrollLeft
            + document.documentElement.scrollLeft;
        posy = e.clientY + document.body.scrollTop
            + document.documentElement.scrollTop;
    }
    // posx and posy contain the mouse position relative to the document
    // Do something with this information
}

Затем вы можете использовать это, чтобы определить его положение относительно вашего элемента.

Ужасно, я знаю, но интернет ужасное место.