Пишу расширение. Никак не могу найти способа, как определить экранные координаты нужного мне элемента.
Вариант

var element = window._content.document.getElementById (knownID);
//alert (element.boxObject.screenX);
alert (element.boxObject);

выдает undefined
Подскажите, пожалуйста, другие варианты (или скажите, где ошибка в этом фрагменте).

А что говорит alert(element) ?

ЗЫ. Я в написании расширений ничего не знаю. :rolleyes:

В зависимости от того, что за элемент, выдаются разные варианты. Для картинки - object HTMLImageElement, для  текстового поля - object HTMLInputElement.

Вообще-то у HTMLных объектов никакого boxObject'а нет.
Так что по старинке ручками при помощи offsetTop/Left/Parent.

PS. Есть такая полезная штука: DOM Inspector.

Спасибо за наводку. Пока сделал так

function GetClientX (element)
{
  var result = 0;
  if (element.offsetParent != null)
   result = GetClientX (element.offsetParent);
  result += element.offsetLeft;

  return result;
}

function GetClientY (element)
{
  var result = 0;
  if (element.offsetParent != null)
   result = GetClientY (element.offsetParent);
  result += element.offsetTop;

  return result;
}

var element = window._content.document.getElementById (knownID);
var x = window.screenX + GetClientX (element);
var y = window.screenY + GetClientY (element);

Но все равно есть погрешность - не учитывается расстояние от левой верхней точки браузера до левой верхней точки клиентской области (контента). Как его найти - не знаю...

Нашел еще одну ошибку (или проблему) - если использовать offsetTop/Left/Parent, то не учитывается скроллинг. По идее нужно поправить так

var x = window.screenX + GetClientX (element) - window.scrollX;
var y = window.screenY + GetClientY (element) - window.scrollY;

Но фишка в том, что как бы я не скролил сайт - window.scrollX и window.scrollY всегда по нулям.

PS. Есть такая полезная штука: DOM Inspector.

Где его взять? Он же по умолчанию ставится?

cr@nk
Он по умолчанию теперь не ставится, хотя и есть в поставке. Надо делать выборочную установку и отметить опцию DOM Inspector.

Может в этом расширении ты сможешь найти нужный код.
http://www.extensionsmirror.nl/index.php?showtopic=2020

А случайно никто не разобрался почему window.scrollX всегда равно 0? Если пытаться его получить в своем плагине, то все нормально. А как найти положение скрола из расширения - не могу понять.
Подскажите пожалуйста, бо очень срочная работа.:cry:

document.body.scrollLeft, document.body.scrollTop?

...почему window.scrollX всегда равно 0?...

Наверное, потому что у окна (корневой элемент <window> файла browser.xul) нет полос прокрутки, т. е., дочерние xul-элементы окна при переполнении "обрезаются".

Полосы прокрутки есть у html-документа, так что

Выделить код

Код:

window. getBrowser (). contentWindow. scrollX

Большое спасибо Mash:

Выделить код

Код:

window.content.document.body.scrollLeft

- прошло.

Но у меня была еще проблема в том, что надо было получить эти координаты в компоненте. переклинило меня и не подумала, что могу сделать так:

Выделить код

Код:

nsCOMPtr<nsIDOMHTMLDocument> htmlDoc(do_QueryInterface(doc, &rv));

   nsIDOMHTMLElement*  aBody;
   rv = htmlDoc->GetBody(&aBody);
   if (!NS_SUCCEEDED(rv)) return false;

   nsCOMPtr<nsIDOMNSHTMLElement> element_sc(do_QueryInterface(aBody, &rv));

   int iXsc,iYsc;
   element_sc->GetScrollLeft(&iXsc);
   element_sc->GetScrollTop(&iYsc);

и все получилось. А то совсем с этим скролом замучалась...

Anton  ого не знала, что такое бывает с xul-элементами.

Кстати в связи со всем этим разбирательство возникла такая проблема. В начале пыталась так:

Выделить код

Код:

nsIDOMElement* elem_doc;  
   rv = doc->GetDocumentElement(&elem_doc);
   if (!NS_SUCCEEDED(rv)) return false;

   nsCOMPtr<nsIDOMNSHTMLElement> element_sc(do_QueryInterface(elem_doc, &rv));
   if (!NS_SUCCEEDED(rv)) return false;

   int iXsc,iYsc;
   element_sc->GetScrollLeft(&iXsc);
   element_sc->GetScrollTop(&iYsc);

возвращались правильные значения, но потом клинило весь остальной код и работающая программа отказывалась выполнять любые действия. Поэтому пошла другим путем (описан в предыдущем посте).

Может ей мешало: element_sc(do_QueryInterface(elem_doc, &rv)) ?

Так и не разобаралась. Интересно - может кто-то знает в чем дело?