在Firefox中查找CTRL-F文本的顶级X窗口X/y坐标

在Firefox中查找CTRL-F文本的顶级X窗口X/y坐标,firefox,coordinates,selection,Firefox,Coordinates,Selection,我需要以编程方式确定通过在Firefox中使用CTRL-f找到的文本的顶级X窗口坐标。例如,从以下顺序开始: 在Linux上打开Firefox(此处不涉及MS Windows) 浏览到某个网页 键入CTRL-f开始查找页面中存在的文本“foo” Firefox然后按预期高亮显示文本 键入Escape键,它消除了页面底部的“查找”工具栏 现在,在这一点上,我想打开草稿行(Shift-F4),并键入一些javascript,将突出显示/选择的文本左上角点的X和Y坐标转储到控制台(再次澄清,坐标需要是

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

  • 在Linux上打开Firefox(此处不涉及MS Windows)
  • 浏览到某个网页
  • 键入CTRL-f开始查找页面中存在的文本“foo”
  • Firefox然后按预期高亮显示文本
  • 键入Escape键,它消除了页面底部的“查找”工具栏
  • 现在,在这一点上,我想打开草稿行(Shift-F4),并键入一些javascript,将突出显示/选择的文本左上角点的X和Y坐标转储到控制台(再次澄清,坐标需要是顶级X窗口坐标)。坐标需要转换为相对于顶级X窗口(Firefox窗口)的坐标

    我不想安装任何Firefox扩展,比如Selenium,只想使用纯javascript。如果可能的话,我也不想修改正在加载和查看的页面的内容

    问题似乎与此类似。
    window.getSelection()
    方法返回文本字符串,但我专门查找该字符串在X窗口上的X和Y坐标

    编辑#1:请注意,给定的“窗口坐标”与顶级X窗口坐标不同。这个问题的一个可行答案包括完整的仿射转换javascript代码,用于将元素或节点坐标转换为顶级X窗口坐标(即使这意味着将中间转换为“窗口坐标”,如所示)

    编辑#2:可能的答案正在研究中,但我仍在确认。通过以下编辑#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或 在页面中,x和y值将不正确 (比例问题)。但我发现如果不涉及缩放,x y值是绝对X根窗口(在Linux下的X11下) 坐标,不相对于Firefox X根窗口的原点, 这是我最初要求的


    我已经询问了一个单独的相关问题。

    您可以使用从选择中获得的范围的
    getClientRects()
    方法来完成此操作。看

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


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

    下面的Javascript代码演示了如何正确获取 选定文本的缩放原点坐标。选定的文本 包括在键入CTRL-f时选择的内容,键入一些 然后选择,然后键入Escape

    为了使
    screenpixelspercspixel
    无需 抛出异常时,中的
    devtools.chrome.enabled
    标志
    about:config
    应设置为true,您必须使用 草稿行
    环境
    菜单选择
    浏览器
    配置 (详情请参见)

    为避免安全风险,请务必启用
    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
    
    我验证了上述方法在 内容窗口,使生成的坐标值嵌入
    结果
    字符串对应于绝对X根窗口
    协调。我没有在MS Windows上测试上述内容。

    将答案标记为有用。但是,我实际需要的是所选文本范围左上角Firefox X(X11)窗口的顶级X窗口坐标,而不是相对于“document”对象的坐标。@bgoodr:在Firefox中,您可以通过将和添加到
    X
    y
    坐标中,虽然我从来没有用过这些,但我不能担保它们。@Tim_Down:非常感谢!这可能是我想要的,但我必须在上修改JSFIDLE的副本,以便在目标X窗口管理器上确认它是否足够可靠。@Tim_Down:我看到了您对答案的编辑,但是JSFIDLE.net演示链接没有显示任何Javascript代码。你能修好吗?@Tim_Down:at也没有出现。嗯,也许这是jsfiddle.net上的一个小故障?