Я закончил тем, что пошел с WebKit window.webkitConvertPointFromNodeToPage
, но я продолжал сталкиваться с ошибкой, когда она возвращала позицию, которая была полностью неправильной. Дальнейшее исследование показало, что если рассматриваемый узел был отображен: inline, то он вернул бы позицию последнего элемента блока в иерархии.
Поиск разрешения для этого изображения ничего не дал (все, что я нашел, было очень простой информацией о том, что на самом деле сделал webkitConvertPointFromNodeToPage, и исходный код WebKit).
Догадываясь, я обнаружил, что он вернул правильную позицию, если элемент имел display: inline-block
, поэтому, если элемент был встроенным, я изменил его на inline-block и затем вычислил позицию.
Если у кого-то есть лучшее решение этой проблемы, я бы хотел услышать от вас!
Edit:
Оказывается, изменение стиля отображения на встроенный блок не всегда хорошая идея, поэтому вместо этого я использую этот метод:
var offset = {x: 0, y: 0};
if ( getStyle(el, 'display') == 'inline' ) {
offset.x = el.offsetLeft - el.parentNode.offsetLeft;
offset.y = el.offsetTop - el.parentNode.offsetTop;
}
var point = window.webkitConvertPointFromNodeToPage(el, new WebKitPoint(0, 0));
return {
x: Math.round(point.x + offset.x),
y: Math.round(point.y + offset.y)
}
Я беру встроенный дочерний метод offsetTop / Left и вычитаю его из родительского элемента. Я не совсем уверен, как это работает с родителями, у которых есть дисплей: встроенный, но он работает 90% времени.
Но если у кого-то есть идея получше, я все еще открыт для предложений.