В IE, как я могу найти экранные координаты элемента HTML, включая элементы внутри фреймов? - PullRequest
1 голос
/ 01 февраля 2011

Я работаю над инфраструктурой автоматизации браузера , которая, помимо других браузеров, поддерживает IE. Поэтому мне нужно получить экранные координаты элементов, с которыми пользователь хочет взаимодействовать. Основным методом, который мы используем для получения этих координат, является использование getBoundingClientRect (). Проблема в том, что в IE эти координаты всегда задаются относительно верхнего левого угла прилагаемого документа. Если элемент находится во фрейме / фрейме, это могут быть не экранные координаты элемента относительно верхнего левого угла окна браузера.

Я использую COM через C ++ для управления браузером, хотя я могу выполнять JavaScript через этот уровень драйвера C ++. Я также вытесняю его из процесса, что означает, что я не выполняюсь в объекте Browser Helper Object (BHO или IE надстройка). Переезд на BHO не вариант для этого проекта. Помимо работы с IE 6, 7, 8 и 9, мне не нужно беспокоиться о кросс-браузерной совместимости для любого метода, который я могу найти, который работает. Использование jQuery или аналогичного ему на самом деле не вариант, но если есть решение, использующее библиотеку JavaScript, возможно, я смогу реверс-инжиниринг решения, приемлемого для использования в проекте.

Вот некоторые из вещей, которые я пробовал до сих пор:

  • Используйте element.ownerDocument.parentWindow.frameElement в JavaScript. Это не удастся, если содержащий документ и документ внутри фрейма находятся в разных доменах.
  • Используйте IHTMLWindow4 :: get_frameElement () для окна, содержащего элемент в кадре. Это должен быть C ++ эквивалент метода JavaScript выше; однако он возвращает E_NOINTERFACE, когда я пытаюсь его использовать.
  • Используйте IDisplayServices :: TransformPoint () для преобразования координат верхнего левого угла элемента в другую систему отсчета. Это не похоже на кросс-процесс.

Как найти или рассчитать координаты экрана элемента HTML относительно верхнего левого угла окна браузера, если целевой элемент может существовать в кадре или в фрейме?

Ответы [ 2 ]

0 голосов
/ 09 марта 2011

Правильный подход для этого проекта состоит в том, чтобы получить документ, содержащий элемент frame или iframe и циклически проходящий через набор кадров в этом родительском документе, пока вы не найдете подходящий кадр.Оказавшись там, вы можете получить элемент или, используя document.parentWindow.frameElement (), и можете рассчитать местоположение содержащего элемента оттуда.Фактический код, решающий проблему, можно найти в ElementWrapper :: GetFrameOffset () по адресу по этой ссылке .

0 голосов
/ 02 февраля 2011

Вы должны иметь возможность использовать IDisplayServices :: TransformPoint. Насколько я помню, вы не можете упорядочить этот интерфейс (я не знаю почему) ... как вы используете его кросс-процесс?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...