【发布时间】:2012-12-16 13:29:46
【问题描述】:
我需要以编程方式确定在 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。如果可能的话,我也不想修改正在加载和查看的页面的内容。
selected text and xy coordinates 问题似乎与此类似。 window.getSelection() 方法返回文本字符串,但我正在寻找该字符串的 X 和 Y 坐标,因为它在 X 窗口上。
编辑 #1:请注意,http://javascript.info/tutorial/coordinates 给出的“窗口坐标”与顶级 X 窗口坐标不同。这个问题的一个可行答案包括从元素或节点坐标转换为顶级 X 窗口坐标的完整仿射转换 javascript 代码(即使这意味着中间转换为 http://javascript.info/tutorial/coordinates 给出的“窗口坐标”)。
编辑#2:可能的答案在https://stackoverflow.com/a/14119731/257924 中,但我仍在确认它。通过下面的 EDIT #3 确认:
编辑#3:Tim Downs answer 的后续行动:这是有效的,但需要注意的是:
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 根窗口的原点无关, 这是我最初要求的。
我已就accessing the scaling factor during debugging 提出了一个单独的相关问题。
【问题讨论】:
标签: firefox coordinates selection