Нахождение координат X / Y верхнего уровня X Window текста CTRL-F в Firefox

Мне нужно программно определить координаты X-окна верхнего уровня текста, который находится с помощью CTRL-f в Firefox. Например, начиная с этой последовательности:

  1. Откройте Firefox в Linux (MS Windows здесь не используется).
  2. Перейдите на какую-нибудь веб-страницу.
  3. Введите CTRL-f, чтобы начать поиск текста "foo", который существует на странице.
  4. Firefox затем выделяет текст, как и ожидалось.
  5. Введите клавишу Escape, которая исключает панель инструментов поиска в нижней части страницы.

Теперь, на этом этапе, я хочу открыть Scratchpad (Shift-F4) и набрать некоторый JavaScript, который выведет на консоль координаты X и Y верхней левой точки текста, который выделен / выделен (снова, чтобы уточнить, координаты должны быть координатами X-окна верхнего уровня). Координаты должны быть преобразованы в координаты относительно X-окна верхнего уровня (окно Firefox).

Я бы предпочел не устанавливать какие-либо расширения Firefox, такие как Selenium, просто используйте прямой JavaScript. Я также не хочу изменять содержимое загружаемой и просматриваемой страницы, если это возможно.

Отобранный текст и вопрос координат xy кажется подобным этому. window.getSelection() Метод возвращает текстовую строку, но я специально ищу координаты X и Y этой строки, как в окне X.

РЕДАКТИРОВАНИЕ № 1: Обратите внимание, что "координаты окна", заданные http://javascript.info/tutorial/coordinates, не совпадают с координатами X-окна верхнего уровня. Жизнеспособный ответ на этот вопрос включает полный код javascript аффинного преобразования для преобразования из координат элемента или узла в координаты окна верхнего уровня X (даже если это означает промежуточные преобразования в "координаты окна", как указано в http://javascript.info/ учебник / координаты).

РЕДАКТИРОВАТЬ #2: Возможный ответ находится в работах в /questions/42655063/nahozhdenie-koordinat-x-y-verhnego-urovnya-x-window-teksta-ctrl-f-v-firefox/42655066#42655066 но я все еще подтверждаю это. Подтверждено с помощью EDIT #3 ниже:

РЕДАКТИРОВАТЬ #3: Продолжение ответа Тим Даунс: Это то, что сработало, с оговоркой:

var sel = window.getSelection();
var result = "no_selection";
if (sel.rangeCount) {
    var range = sel.getRangeAt(0).cloneRange();
    if (range.getBoundingClientRect) {
        range.collapse(true);
        var rect = range.getBoundingClientRect();
        if (rect) {
            x = rect.left;
            y = rect.top;
            x += window.mozInnerScreenX;
            y += window.mozInnerScreenY;
            result = "" + x + " " + y;
        }
    }
}
result

Предостережение заключается в том, что если пользователь масштабировал страницу, нажимая CTRL-PLUS или CTRL-MINUS на странице, значения x и y будут неправильными (проблема масштабирования). Но я обнаружил, что если масштабирование не задействовано, значения x и y были абсолютными координатами корневого окна X (под X11 в Linux), а не относительно происхождения корневого окна Firefox X, о чем я изначально просил.

Я задал отдельный связанный вопрос о доступе к коэффициенту масштабирования во время отладки.

2 ответа

Решение

Вы можете сделать это с помощью getClientRects() метод диапазона, полученный из выбора. См. /questions/19479961/koordinatyi-vyidelennogo-teksta-na-stranitse-brauzera/19479976#19479976

Для преобразования координат, возвращаемых прямоугольником, возвращаемым getClientRects() в координаты относительно "экрана" только в Firefox, вы можете использовать window.mozInnerScreenX а также window.mozInnerScreenY, Демо ниже; результаты кажутся правдоподобными в Firefox на Windows.

http://jsfiddle.net/timdown/gaw5W/1/

Учитывая, что jsfiddle.net не отвечает (указано в ответе Тима), я отвечаю своим собственным решением ниже, в котором также рассматривается проблема, описанная в "РЕДАКТИРОВАТЬ № 3" в моем вопросе о получении коэффициента масштабирования.

Следующий код Javascript демонстрирует, как получить правильно масштабированную исходную координату выделенного текста. Выбранный текст включает в себя то, что выделено, если вы набираете CTRL-f, набираете некоторый текст, который затем выбирается, и вы нажимаете Escape.

Для того чтобы screenPixelsPerCSSPixel быть доступным без исключения, devtools.chrome.enabled флаг вabout:config должно быть установлено в true, и вам придется использовать Scratchpads Environment меню для выбора Browser Конфигурация (см. Проверка значения Firefox Components.interfaces.nsIDOMWindowUtils.screenPixelsPerCSSPixel в Javascript Scratchpad).

Чтобы избежать угроз безопасности, обязательно включите devtools.chrome.enabledвернуться к значению false после попытки кода ниже.

После применения указанных выше изменений конфигурации введите следующий текст в блокнот, поместите курсор после "результата" в самом конце и нажмите CTRL-L, чтобы увидеть результат.

var contentWindow = window.content;
var sel = contentWindow.getSelection();
var result = "no_selection";
if (sel.rangeCount) {
    var range = sel.getRangeAt(0).cloneRange();
    if (range.getClientRects) {
        range.collapse(true);
        var rect = range.getClientRects()[0];
        if (rect) {
            x = rect.left;
            y = rect.top;
            x += contentWindow.mozInnerScreenX;
            y += contentWindow.mozInnerScreenY;
            var util = contentWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowUtils);
            x *= util.screenPixelsPerCSSPixel;
            y *= util.screenPixelsPerCSSPixel;
            result = "" + x + " " + y;
        }
    }
}
result

Я проверил, что вышеописанное правильно обрабатывает масштабирование в окне содержимого так, что результирующие значения координат, встроенные в result Строка соответствует абсолютным X координатам корневого окна. Я не проверял выше на MS Windows.

Другие вопросы по тегам