0

我需要以编程方式确定在 Firefox 中使用 CTRL-f 找到的文本的顶级 X 窗口坐标。例如,从这个序列开始:

  1. 在 Linux 上打开 Firefox(此处不涉及 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 窗口坐标不同。这个问题的一个可行答案包括从元素或节点坐标转换为顶级 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 根窗口的原点。

我已经询问了有关在调试期间访问比例因子的单独相关问题。

4

2 回答 2

1

您可以使用getClientRects()从选择中获得的范围的方法来执行此操作。见https://stackoverflow.com/a/6847328/96100

要将由返回的矩形返回的坐标转换为仅在 Firefox 中getClientRects()相对于“屏幕”的坐标,您可以使用和。演示如下;在 Windows 上的 Firefox 中,结果似乎是合理的。window.mozInnerScreenXwindow.mozInnerScreenY

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

于 2013-01-02T09:40:27.130 回答
0

鉴于 jsfiddle.net 没有响应(在Tim 的回答中引用),我在下面用我自己的解决方案进行回复,该解决方案也解决了我在“编辑 #3”中描述的关于获取比例因子的问题。

以下 Javascript 代码演示了如何获取所选文本的正确缩放的原点坐标。选定的文本包括如果您键入 CTRL-f、键入一些随后被选定的文本并键入 Escape 时选定的内容。

为了在screenPixelsPerCSSPixel不抛出异常的情况下可用,应该将devtools.chrome.enabled标志 about:config设置为 true,并且您必须使用 ScratchpadsEnvironment菜单来选择Browser配置(有关详细信息,请参阅Inspecting Firefox Components.interfaces.nsIDOMWindowUtils.screenPixelsPerCSSPixel value in Javascript Scratchpad) .

为避免安全风险,请务必devtools.chrome.enabled 在尝试以下代码后将 flag 转回 false。

应用上述配置更改后,在 Scratchpad 中键入以下文本,将光标放在最后的“结果”之后,然后键入 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 上测试过上述内容。

于 2013-01-12T15:27:52.600 回答