Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Определение координат картинки


Автор: proger 14.8.2006, 14:18
Нас странице много таблиц и внутри одной из таблиц есть картинка, как определитьее координаты???
document.getElementById(id+'_img').offsetLeft выводит не ту координату!

Автор: skyboy 14.8.2006, 14:27
проверить совсем некак, однако вопрос: может, тебе возвращается сдвиг относительно родителя, а не страницы? И тогда есть смысл прибавить offsetLeft для parentNode?

Автор: vasac 14.8.2006, 14:27
Скорее всего это координата, относительно родительского объекта.
Попробуй пройтись по предкам до корня, суммируя offsetLength

-- опоздал  smile 

Автор: proger 14.8.2006, 14:30
vasac, 
А как это сделать???

Добавлено @ 14:30 
vasac, можно пример???

Автор: skyboy 14.8.2006, 14:34
Код

var offset= 0;
var el= document.getelementById('zzzz'); // вышли на "наш" элемент
while(el!= undefined && el.offsetLeft!= undefined) // если у нас текущий элемент(родитель родителя или ещё более замороченные родственники) существует и у него есть свойство "сдвиг слева", то прибавим к нашей "копилке" значение этого сдвига
 { 
   ofset+= el.offsetLeft; // увеличиваем сдвиг-сумму
   el= el.parentNode; // переходим к родителю
 } 

Вроде бы так...
Правильное значение возвращает?

Автор: proger 14.8.2006, 14:50
skyboy, Возращает ошибку, обьект не поддерживает это свойство или метод!

Добавлено @ 14:55 
skyboy, нет, работает, спасибо!

Добавлено @ 15:01 
skyboy, Немного неверно определ. координаты, уходит сильно в право!

Автор: skyboy 14.8.2006, 15:05
proger, скинь полный код страницы. Ну, по крайней мере, чтоб была таблица и картинка - совсем некогда самому набивать...

Добавлено @ 15:13 
странно. у меня нормально работает. там и правда вычислялось относительно предка... Но "сильно вправо" у меня не уходит...

Автор: 12345c 14.8.2006, 15:19
Правильно будет работать функция getPosition(), которая та же самая, но не c parentNode , а c offsetParent .

Код
getPosition=function(o){var x=y=0;
    while(o){x+=o.offsetLeft;y+=o.offsetTop;o=o.offsetParent;}
return[x,y]};


Такие же темы:
http://forum.vingrad.ru/index.php?showtopic=90327
http://forum.vingrad.ru/index.php?showtopic=39692
http://forum.vingrad.ru/index.php?showtopic=28220

Автор: skyboy 14.8.2006, 15:56
12345c, а почему не определяется через parentNode?

Автор: 12345c 14.8.2006, 20:22
Он в таблице проходит все ноды - TD, TR,TBODY,TABLE, а надо только TD,TABLE, поэтому считает лишнее. Для списков и прочих тегов должно совпадать.

Автор: skyboy 14.8.2006, 21:00
12345c, странно. Ты хочешь сказать, что лишнее смещение(которое у себя не нашёл) появляется от того, что TD смещено относительно TR, TR - относительно TBODY, а  TBODY - относительно TABLE? Странно как-то, ведь если бы между ними реально были бы отступы, они бы и отображались тоже и всё соответствовало бы действительности.... Или я тебя не понял?

Автор: Zeroglif 15.8.2006, 00:07
Цитата(skyboy @  14.8.2006,  21:00 Найти цитируемый пост)
что лишнее смещение(которое у себя не нашёл) появляется от того

Без кода - гадать про смещение бесполезно. На получение точной позиции может влиять position (relative, absolute), может влиять overflow и проч. 

IE (и Опера, скорее всего тоже) не посчитают размер TD border, в этом случае нужно будет скормить clientLeft/clientTop и т.д. и т.п.

Цитата(12345c @  14.8.2006,  15:19 Найти цитируемый пост)
Правильно будет работать функция getPosition(), которая та же самая, но не c parentNode , а c offsetParent .

getPosition=function(o){var x=y=0;
    while(o){x+=o.offsetLeft;y+=o.offsetTop;o=o.offsetParent;}
return[x,y]};

Ошибка с игреком... (а всё потому, что никак не хочешь красоту навести, отступов да пробелов с переносиками добавить бы...)  smile 

Автор: proger 15.8.2006, 08:51
Цитата(12345c @  14.8.2006,  15:19 Найти цитируемый пост)
Правильно будет работать функция getPosition(), которая та же самая, но не c parentNode , а c offsetParent .


Разметка HTML
1:
2:
3:

getPosition=function(o){var x=y=0;
    while(o){x+=o.offsetLeft;y+=o.offsetTop;o=o.offsetParent;}
return[x,y]};


ОТЛИЧНО РАБОТАЕТ!

Автор: 12345c 15.8.2006, 14:08
Цитата(Zeroglif @  15.8.2006,  00:07 Найти цитируемый пост)
Ошибка с игреком
А, точно,

Код
getPosition=function(o){var y;var x=y=0;
    while(o){x+=o.offsetLeft;y+=o.offsetTop;o=o.offsetParent;}
return[x,y]};


Добавлено @ 14:14 
Цитата(skyboy @  14.8.2006,  21:00 Найти цитируемый пост)
что лишнее смещение(которое у себя не нашёл) появляется от того, что TD смещено относительно TR
, они смещены, но ошибка при parentNode оттого, что смещение TR или TBODY излишне плюсуется при этой рекурсии.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)