Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.12.2007, 15:44
Новичок на форуме
Отправить личное сообщение для sigurd Посмотреть профиль Найти все сообщения от sigurd
 
Регистрация: 18.12.2007
Сообщений: 7

Вопрос: И опять про 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 отступ от первого дочернего элемента, то есть, от спозиционированной по правому краю картинки.

Есть предолжения, что с этим делать?
Ответить с цитированием
  #2 (permalink)  
Старый 22.12.2007, 22:42
Аватар для Илья Кантор
Администратор
Отправить личное сообщение для Илья Кантор Посмотреть профиль Найти все сообщения от Илья Кантор
 
Регистрация: 25.05.2007
Сообщений: 1,225

в IE в quirks mode другая модель боксовая.. Может в этом дело
Ответить с цитированием
  #3 (permalink)  
Старый 08.02.2008, 13:39
Аватар для DonQuijote
Новичок на форуме
Отправить личное сообщение для DonQuijote Посмотреть профиль Найти все сообщения от DonQuijote
 
Регистрация: 08.02.2008
Сообщений: 4

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

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

Только там кажется координаты на 2 пикселя смещены. getBoundingClientRect Method (A, ABBR, ACRONYM, ...)
Ответить с цитированием
  #4 (permalink)  
Старый 08.02.2008, 13:55
Новичок на форуме
Отправить личное сообщение для sigurd Посмотреть профиль Найти все сообщения от sigurd
 
Регистрация: 18.12.2007
Сообщений: 7

Ок, спасибо, попробую...
Ответить с цитированием
  #5 (permalink)  
Старый 08.02.2008, 15:11
Новичок на форуме
Отправить личное сообщение для sigurd Посмотреть профиль Найти все сообщения от sigurd
 
Регистрация: 18.12.2007
Сообщений: 7

Супер, работает! ;-)
Ответить с цитированием
  #6 (permalink)  
Старый 25.08.2008, 01:53
Wamark
 
Сообщений: n/a

:-)
Ой, спасибо, тоже искал! Все перепробовал! Решил уж перебирать parentElement до самого <body>
Ответить с цитированием
  #7 (permalink)  
Старый 25.08.2008, 02:45
Wamark
 
Сообщений: n/a

баг
Только вот Опера не хочет с этой функцией работать... при выполнении строчки вызова getBoundingClientRect() для объекта выходит из функции :-((
Ответить с цитированием
  #8 (permalink)  
Старый 25.08.2008, 02:46
Wamark
 
Сообщений: n/a

Короче, че американцу хорошо,то норвежцу - плохо. и наоборот
Ответить с цитированием
  #9 (permalink)  
Старый 25.03.2010, 09:25
Новичок на форуме
Отправить личное сообщение для rkazanova Посмотреть профиль Найти все сообщения от rkazanova
 
Регистрация: 25.03.2010
Сообщений: 2

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

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;
}
Ответить с цитированием
  #10 (permalink)  
Старый 25.03.2010, 10:30
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

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

Там есть такая функция "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';


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

П.С. Вот ещё статейка для общего понимания: Координаты элемента на странице
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос по long poll megaswin AJAX и COMET 2 27.05.2008 09:20
вопрос про сверхдинамичный интерфейс Гость AJAX и COMET 2 05.04.2008 01:02