在Firefox中查找CTRL-F文本的顶级X窗口X/y坐标
我需要以编程方式确定通过在Firefox中使用CTRL-f找到的文本的顶级X窗口坐标。例如,从以下顺序开始:在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坐标转储到控制台(再次澄清,坐标需要是
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上的一个小故障?