从Firefox扩展中获取DOM元素的绝对屏幕边界
Get absolute screen bounds of a DOM element from a Firefox extension
我有一个firefox扩展,它需要获得DOM元素的确切屏幕坐标,并通过js/c-types将其传递给本地DLL。
现在我已经涵盖了大部分内容:
var gDomWindowUtils = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(nsIDOMWindowUtils);
function getScreenRect(oElem)
{
var rc =
{
x : 0,
y : 0,
w : 0,
h : 0
};
var o = oElement;
while(o != null)
{
rc.y += o.offsetTop;
rc.x += o.offsetLeft;
o = o.offsetParent;
}
var x = {}, y = {};
gDomWindowUtils.getScrollXY(false, x, y);
rc.x -= x.value;
rc.y -= y.value;
var scale = gDomWindowUtils.screenPixelsPerCSSPixel;
rc.x *= scale;
rc.y *= scale;
rc.w *= scale;
rc.h *= scale;
return rc;
};
这可以处理滚动和缩放,但我得到的值是相对于浏览器窗口的,而不是相对于屏幕的。
如何检测浏览器实际渲染区域的客户端区域偏移?我甚至可以通过js/ctypes使用本机代码(Win32),所以我试着看看是否可以使用FindWindow()/GetWindowRect()来获得它,但整个firefox是一个HWND,控件都不是本机窗口。
因此,我的一个想法是,由于firefox的UI是一个XUL文档,我应该能够获得菜单栏、选项卡栏等,并找到浏览器区域的绝对偏移量。但是,我不知道如何访问定义浏览器UI的XUL树。
有人能给我一个指针吗?
[编辑]忽略上面代码中未定义的rc.w和rc.h,这与问题无关。
您基本上已经得到了它,但我建议使用getBoundingClientRect()而不是offsetLeft/offsetTop
:
var rect = oElement.getBoundingClientRect();
var rc = {
x: rect.left,
y: rect.top,
w: rect.width,
h: rect.height
};
getBoundingClientRect()
考虑滚动,这样您就不需要添加它了。您可以使用window.mozInnerScreenX
和window.mozInnerScreenY
:获得相对于屏幕的坐标
rc.x += window.mozInnerScreenX;
rc.y += window.mozInnerScreenY;
然后将这些值与screenPixelsPerCSSPixel
相乘。这应该会给你合适的屏幕坐标。
我将再添加一个帮助我解决类似问题的"技巧"。
每当我的代码接收到mousemove事件时,我都会捕捉该事件提供的所有坐标中的鼠标光标位置,其中至少包括"screen"、"client"answers"pageXY"坐标。然后,对于任何其他目的,我可以通过减去其中适当的两个来计算这些坐标之间的差。
在你的情况下,你可能会计算这样的偏移:
deltaX = event.screenX - event.clientX;
deltaY = event.screenY - event.clientY;
或
offsetX = event.screenX - event.pageX;
offsetY = event.screenY - event.pageY;
然后只需将deltaX和deltaY或offsetX和offsetY添加到这些坐标中即可获得屏幕坐标。
- 如何将屏幕分辨率乘以 80%,然后在代码中使用
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 使用图像数组列表的simplegallary.js显示适合桌面屏幕的图像
- 导航栏没有调整到浏览器屏幕的大小
- 调整屏幕大小后不显示子菜单
- 如何在p5.js中管理多智力竞赛游戏的多个屏幕
- jQuery:当屏幕大小改变时,如何更改默认图像和悬停图像
- 当带有渲染器的DOM元素不在屏幕顶部时,移动了场景的坐标
- 如何知道元素在屏幕上是否可见.如果没有,请滚动页面
- 如果使用javascript函数屏幕太小,我该如何更改HTML文件的背景色
- 如何打开/移动主屏幕左侧的浏览器窗口
- 如何在屏幕外或项目的中心视口中跟随YUI驱动的动画
- 用HTML在不同屏幕上显示和隐藏内容的方法
- 调整屏幕大小时更改属性值
- 检测非移动页面上的移动设备屏幕宽度和高度
- 更改屏幕上对象的宽度调整大小
- 获取屏幕截图并在电子邮件中发送的按钮
- 获取以屏幕像素为单位的旋转SVG元素的边界
- OpenLayers 3 中的当前屏幕边界框
- 从Firefox扩展中获取DOM元素的绝对屏幕边界