Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос: И опять про offsetLeft... (https://javascript.ru/forum/misc/83-vopros-i-opyat-pro-offsetleft.html)

sigurd 18.12.2007 15:44

Вопрос: И опять про offsetLeft...
 
Сорри, если повторю уже много раз задаваемый вопрос. Стоит задача далеко не новая - определить координаты элемента на странице. Результаты поиска по форумам, инету, да и просто текущая рабочая версия сводятся к простому проходу по цепочке offsetParent до BODY с суммированием offsetLeft и offsetTop. Это уже много раз было, много раз проходилось и т.д. и т.п. и см. на обороте.

А теперь имеем страницу:
<div style="width: 500px; border: solid 1px red; padding: 10px;">
  <div id="inner" style="border: solid 1px green;">
    <a href="/">
      <img [b]align="right"[/b] id="testimg" height="15" width="15" src="myimage.jpg" border="0" />
    </a>
Текст текст текст текст текст текст текст 
текст текст текст текст текст текст текст 
текст текст текст текст текст текст текст 
текст текст текст текст текст текст текст 
текст текст текст текст текст 
  </div>
</div>
<script>
window.onload = function () {
  var obDiv = document.getElementById('inner');
  alert(obDiv.[b]offsetLeft[/b]);
}
</script>

FF, Opera, Safari выдают правильные значения, а вот IE всех доступных под рукой версий выдает в качестве значения offsetLeft отступ от первого дочернего элемента, то есть, от спозиционированной по правому краю картинки.

Есть предолжения, что с этим делать?

Илья Кантор 22.12.2007 22:42

в IE в quirks mode другая модель боксовая.. Может в этом дело

DonQuijote 08.02.2008 13:39

Да , IE в своем репертуаре. Для него можно использовать getBoundingClientRect().

var obj = obDiv.getBoundingClientRect();
var left = obj.left;

Только там кажется координаты на 2 пикселя смещены. getBoundingClientRect Method (A, ABBR, ACRONYM, ...)

sigurd 08.02.2008 13:55

Ок, спасибо, попробую...

sigurd 08.02.2008 15:11

Супер, работает! ;-)

Wamark 25.08.2008 01:53

:-)
 
Ой, спасибо, тоже искал! Все перепробовал! Решил уж перебирать parentElement до самого <body>

Wamark 25.08.2008 02:45

баг
 
Только вот Опера не хочет с этой функцией работать... при выполнении строчки вызова getBoundingClientRect() для объекта выходит из функции :-((

Wamark 25.08.2008 02:46

Короче, че американцу хорошо,то норвежцу - плохо. и наоборот

rkazanova 25.03.2010 09:25

здравствуйте. ситуация наоборот поставил скрипт календаря, он в ИЕ появляется по месту клика, а в мозиле и хроме в левом углу сверху.
Что нужно изменить? или дописать, чтоб біла кросс-браузерность

function Left(obj)
{ var curleft = 0;
if (obj.offsetParent)
{
while (obj.offsetParent)
{
curleft += obj.offsetLeft
obj = obj.offsetParent;
}
}
else if (obj.x)
curleft += obj.x;
return curleft;
}
function Top(obj)
{ var curtop = 0;
if (obj.offsetParent)
{
while (obj.offsetParent)
{
curtop += obj.offsetTop
obj = obj.offsetParent;
}
}
else if (obj.y)
curtop += obj.y;
return curtop;
}

Nekromancer 25.03.2010 10:30

Как раз недавно юзал этот календарь, везде всё нормально с кординатами, дело в другом.

Там есть такая функция "lcs", а в ней есть пару строчек:
getObj('fc').style.left=Left(ielem);
	getObj('fc').style.top=Top(ielem)+ielem.offsetHeight;


Как видно скрипт старый и разработчик не грамотный, при нормальном доктайпе это не работает.
Должно быть хотя бы так:
getObj('fc').style.left=Left(ielem)+'px';
	getObj('fc').style.top=Top(ielem)+ielem.offsetHeight+'px';


Хотя лучше всего взять и переписать календарь под себя, честно слово, код ужасный.

П.С. Вот ещё статейка для общего понимания: Координаты элемента на странице


Часовой пояс GMT +3, время: 15:59.