Нахождение координат X / Y верхнего уровня X Window текста CTRL-F в Firefox
Мне нужно программно определить координаты X-окна верхнего уровня текста, который находится с помощью CTRL-f в Firefox. Например, начиная с этой последовательности:
- Откройте Firefox в Linux (MS Windows здесь не используется).
- Перейдите на какую-нибудь веб-страницу.
- Введите CTRL-f, чтобы начать поиск текста "foo", который существует на странице.
- Firefox затем выделяет текст, как и ожидалось.
- Введите клавишу 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.
Учитывая, что 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.