我能以某种方式得到精确的屏幕坐标(相对于屏幕的顶部左上角)一个DOM对象。 通过NPAPI \ FireBreath或JavaScript。 (需要这个插件,我正在与FireBreath写)
Answer 1:
您将光标移动到页面的某个地方,并作出click事件。(找到窗口,然后GetWindowRect,caculate一个sutable位置),那么你可以捕捉事件,记录clientX和clientY。 通过这种方式,你建立两个不同的坐标系之间的桥梁。
Answer 2:
PS:我知道,我很久以前就这个问题,但我想总结一下我在结束了。
element.offsetLeft\Top
不起作用真正的意思是有问题的途径。
从HTML,你可以得到COORDS,相对于页面的空间,而不是用户本身屏幕左上角。
而从插件,通过GetWindowRect()
WINAPI功能,你可以得到相对于用户屏幕的浏览器窗口的左上角的坐标,以及由GetClientRect()
你可以得到客户端矩形的左上角的COORDS。
但是,这是不一样的点作为页面的左上角,总有网页的空间角落,和客户端RECT,或矩形窗口之间的东西。 它包括顶部的浏览器栏和其他的东西。
你可以做什么? 看来,有没有简单的100%可控的方式:
你可以尽量考虑那些浏览器酒吧和计算之间的空间Client rect
和页面的矩形,但这些浏览器用户禁止不恒定的用户,可以有更多的人,另一个,你会得到你所有的坐标系搞砸了。 然后,你能以某种方式注册安装酒吧和补充到浏览器的数量,并根据空间计算量,即会被他们消耗掉,但酒吧和增加不一样的,而你又得到了太多的因素需要考虑。
有一点更简单的方法,你可以从上面走,而是从底部-打通一些计算与HTML的矩形的底部点和坐标的element.offset
-您的坐标系统绑定到窗口的左下角点。
您在底部没有得到用户的浏览器吧,因此,可以是一个小页面和窗口的角落之间的空间更加自信,但一些浏览器与下载信息等拿到弹出的酒吧有,在这里,我们把一切都再次搞砸了。
另一种选择是使用模态窗口的-即在模式窗口通过打开页面window.open()
从你的JavaScript,你可以控制浏览器控件和酒吧的数量在这些窗口中,你可以摆脱所有这些userbars,并做出明确只有地址栏和页面窗口。 现在,你有更多的控制,并且几乎可以肯定的,那角落之间的空间将是为所有用户一样的...差不多。
有两件事情需要提及:
1)有些浏览器(如谷歌Chrome,我记得)得到了那些自定义浏览器添加(萤火虫为例)出现近地址栏中显示为小图标,而他们仍然出现在模式窗口的地址栏附近。
你可以问什么区别 - 不同的是,是,由于某种原因,浏览器窗口的顶部变为约5个像素胖,如果有,即使这些图标中的一个(你可以再次尝试注册,是否有任何这些。安装在用户的浏览器,或不)
如果,无论如何,那些5PX不适合你的关键 - 它可以是长的路要走..如果你确定与未来的事情。
2)明显的 - 与模态窗口好玩可以舒服的最终用户,因为这一切削减一些浏览器控件和力学浏览器用户习惯。
Answer 3:
我知道你没有提到的jQuery,但您可以使用http://api.jquery.com/offset/作为一个例子。 它结合了offsetLeft/top
所有的家长和占滚动,给你一个准确的X,Y(相对于体)嵌套节点。
请注意,如果你正在处理事件,事件对象总是告诉你在哪里事件发生使用http://api.jquery.com/event.pageX/和http://api.jquery.com/event.pageY/
再次,提jQuery是灵感仅当您不想使用它。
这里是jQuery的是怎么做的
$.fn.offset = function (options) {
var elem = this[0],
doc = elem && elem.ownerDocument;
if (!doc) {
return null;
}
if (elem === doc.body) {
return jQuery.offset.bodyOffset(elem);
}
return getOffset(elem, doc, doc.documentElement);
}
function getOffset(elem, doc, docElem, box) {
try {
box = elem.getBoundingClientRect();
} catch(e) {}
// Make sure we're not dealing with a disconnected DOM node
if (!box || !jQuery.contains(docElem, elem)) {
return box ? {
top: box.top,
left: box.left
} : {
top: 0,
left: 0
};
}
var body = doc.body,
win = getWindow(doc),
clientTop = docElem.clientTop || body.clientTop || 0,
clientLeft = docElem.clientLeft || body.clientLeft || 0,
scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
top = box.top + scrollTop - clientTop,
left = box.left + scrollLeft - clientLeft;
return {
top: top,
left: left
};
}