offsetLeft & offsetTop

12 отговора 298 прегледа
#1

offsetLeft & offsetTop

Може ли някой да подскаже как да открия абсолютното разстояние от горен ляв ъгъл на страницата до горен ляв ъгъл на обект (който няма position: absolute)...

Пробвах с offsetLeft и offsetTop, обаче те връщат разстоянието до родителския обект.

Пробвах с цикъл да събера разстоянията до всички родителски обекти- стана, обаче offsetLeft и offsetTop не включват дебелината на border-ите!

Добавих и clientLeft и clientTop- за да събирам и дебелините на рамките... Пак не стана- така пък отклонението е в обратна посока...

Та няма ли начин направо да получа координатите на проклетите обекти?

Апропо, обектите са клетки на таблица... Таблицата може да бъде неограничено вложена някъде... предварително не знам колко!

Предварително благодаря!
БАба...


. . . o o o O O O o o o . . .
Отговор
в отговор на БaбaИлиицa #2

Re: offsetLeft & offsetTop

izpolzwai si offsetleft i offsettop, no naprawi edna rekursiwna funkcia na javascript da diri po offsetparent (property w ie) dokato parenta stane body, i si ready :)
ako ti triabwa hint, shte ti spretna nesto ;)

Отговор
в отговор на desertwaste #3

е не става с рекурсивна ф-ция...

Ъхъм... както бях написал- имам такава функция, която ми дава грешка от 1-2 пиксела. Не е много, но за целите, за които ми трябва- е МНОГО!

Грешката идва от това, че offsetLeft и offsetTop не включват размера на рамката (ако е таблица например)...

Както също казах, опитах да прихвана и размера на рамката- също дава грешка в обратна посока- връща по-голямо число отколкото трябва!

БАба...


. . . o o o O O O o o o . . .
Отговор
в отговор на БaбaИлиицa #4

я пробвай тази....

probwai tazi funkcia :


function getcoords(what){
alert("x : "+getx(what)+" y : " + gety(what));
}
function getx(what){
if(what.offsetParent!=null) return what.offsetLeft+ getx(what.offsetParent);
else
return 0;
}

function gety(what){
if(what.offsetParent!=null) return what.offsetTop+ gety(what.offsetParent);
else
return 0;
}



тествах я малко,... но честно казано нямам нерви :)

Отговор
в отговор на desertwaste #5

p.s. bachka na IE, za NS neam idea

p.s. bachka na IE, za NS neam idea

Отговор
в отговор на desertwaste #6

и не става?

Ми не става с тази ф-ция... в MSIE6... Даже ми връща нули!

Моята функция е:


function getabsolute(obj,way) {
var coords = 0;
if (way == 'left') {
while (obj.tagName != 'BODY') {
coords += obj.offsetLeft;// + obj.clientLeft;
obj = obj.offsetParent;
}
return coords;
} else if (way == 'top') {
while (obj.tagName != 'BODY') {
coords += obj.offsetTop;// + obj.clientTop;
obj = obj.offsetParent;
}
return coords;
}
return false;
}


и така написана работи, но с въпросната грешка от 1 пиксел ако има border...

БАба...


. . . o o o O O O o o o . . .
Отговор
в отговор на БaбaИлиицa #7

Re: и не става?

ami ,...
Note: In Microsoft® Internet Explorer 5, the offsetParent property returns the table object for the td object; in Internet Explorer 4.0 it returns the tr object. You can use the parentElement property to retrieve the immediate container of the table cell.


ako tova, koeto mu tyrsish koordz ne e purwa kletka, mai propuskame bordera mezhdu <td>-tata predi nego ...

Отговор
в отговор на БaбaИлиицa #8

Re: и не става?

eto mi go celia sors na towa, s koeto testwam :

<html>
<head>
<script language="javascript">
function getcoords(what){
alert("x : "+getabsolute(what,'left')+" y : " + getabsolute(what,'top'));

}
function getcoords2(what){
alert("x : "+getx(what)+" y : " + gety(what));

}
function getx(what){
if(what.offsetParent!=null) return what.offsetLeft+ getx(what.offsetParent);
else
return 0;
//return what.clientLeft;
}
function gety(what){
if(what.offsetParent!=null) return what.offsetTop+ gety(what.offsetParent);
else {
return 0;
//return what.clientTop;
}
}
function getabsolute(obj,way) {
var coords = 0;
if (way == 'left') {
while (obj.tagName != 'BODY') {
coords += obj.offsetLeft;// + obj.clientLeft;
obj = obj.offsetParent;
}
return coords;
} else if (way == 'top') {
while (obj.tagName != 'BODY') {
coords += obj.offsetTop;// + obj.clientTop;
obj = obj.offsetParent;
}
return coords;
}
return false;
}
</script>
</head>
<body leftmargin=0 topmargin=0>
<table cellspacing=0 cellpadding=0 border=1>
<tr><td width=100>dsadas</td><td><p style="background-color:blue;" onmouseover="getcoords(this);">sadasda</p></td></tr>
<tr><td width=100>dsadas</td><td><p style="background-color:blue;" onmouseover="getcoords2(this);">sadasda</p></td></tr>
</table>
</body>

Отговор
в отговор на desertwaste #10

не съм намерил?!

Ми не съвсем... кажи каква е твоята цака? Аз го направих така, че да проверява при рекурсията си, ако родителя има бордер, добавям 1 пиксел! Проблема е, че ако бордера е по-дебел... пак има отклонение! Но понеже в моя случай няма по-дебели бордери- всичко работи както трябва!

Иначе ме интересува дали има някакъв inetlligent solution!

БАба...


. . . o o o O O O o o o . . .
Отговор
в отговор на БaбaИлиицa #11

Re: не съм намерил?!

znachi,.. dokolkoto razbrah,.. IE dobawia edin pixel, ako taga e td. ne znam zashto go prawi, no izsledwaniata mi stignaha do tozi rezultat.

znachi,...
na wsiaka rekursiwna stupka :

x+= obj.offsetleft + obj.clientleft;
if (obj.tagname==td )x --;

tfa e ideata, sintaksisa nai-weroiatno e neveren

Отговор
в отговор на desertwaste #12

ъм да... и аз това имам!

Да и аз стигнах до същия извод и си направих функцията да проверява и да прави корекция... Но все се надявах, че има някакво интелигентно решение от 1 ред код!

Мерси все пак!

БАба...


. . . o o o O O O o o o . . .
Отговор
в отговор на БaбaИлиицa #13

Re: ъм да... и аз това имам!

ne iskai na exploderski bug elegantno reshenie ;))

shte izglezhda, che ot MS narochno ostawiat bugowete, che da ima i elegantni reshenia za tiah ;))))

ostawa ni samo da preglutnem i da pliuem w pazwata da ne zasichame oste takiwa 'drebni' bugowe ;)

..... a kak psuwah netscape 4.x nawremeto, che ne iska da mi naprawi frame sas shirina 17 pixela........

have pfun :)

Отговор