我需要以编程方式确定在 Firefox 中使用 CTRL-f 找到的文本的顶级 X 窗口坐标。例如,从这个序列开始:
- 在 Linux 上打开 Firefox(此处不涉及 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 窗口坐标不同。这个问题的一个可行答案包括从元素或节点坐标转换为顶级 X 窗口坐标的完整仿射转换 javascript 代码(即使这意味着中间转换为http://javascript.info/给出的“窗口坐标”)教程/坐标)。
编辑#2:可能的答案在https://stackoverflow.com/a/14119731/257924中,但我仍在确认它。通过下面的编辑#3 确认:
编辑#3: Tim Downs的后续回答:这是有效的,但需要注意的是:
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 根窗口(Linux 下 X11 下)坐标,而不是相对于我最初要求的 Firefox X 根窗口的原点。
我已经询问了有关在调试期间访问比例因子的单独相关问题。