Страницы: 1
Пишу расширение. Никак не могу найти способа, как определить экранные координаты нужного мне элемента.
Вариант
var element = window._content.document.getElementById (knownID);
//alert (element.boxObject.screenX);
alert (element.boxObject);
выдает undefined
Подскажите, пожалуйста, другие варианты (или скажите, где ошибка в этом фрагменте).
Отсутствует
В зависимости от того, что за элемент, выдаются разные варианты. Для картинки - object HTMLImageElement, для текстового поля - object HTMLInputElement.
Отсутствует
Вообще-то у HTMLных объектов никакого boxObject'а нет.
Так что по старинке ручками при помощи offsetTop/Left/Parent.
PS. Есть такая полезная штука: DOM Inspector.
Isn't it ironic... don't you think? — Alanis Morissette
Отсутствует
Спасибо за наводку. Пока сделал так
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 всегда по нулям.
Отсутствует
А случайно никто не разобрался почему window.scrollX всегда равно 0? Если пытаться его получить в своем плагине, то все нормально. А как найти положение скрола из расширения - не могу понять.
Подскажите пожалуйста, бо очень срочная работа.
Отсутствует
...почему window.scrollX всегда равно 0?...
Наверное, потому что у окна (корневой элемент <window> файла browser.xul) нет полос прокрутки, т. е., дочерние xul-элементы окна при переполнении "обрезаются".
Полосы прокрутки есть у html-документа, так что
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Большое спасибо Mash:
- прошло.
Но у меня была еще проблема в том, что надо было получить эти координаты в компоненте. переклинило меня и не подумала, что могу сделать так:
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)) ?
Так и не разобаралась. Интересно - может кто-то знает в чем дело?
Отсутствует
Страницы: 1