getBoundingClientRect用于检测可见性

时间:2015-02-03 20:20:26

标签: javascript html dom getboundingclientrect

背景: 我目前正在开发一个项目,我的JS应用程序嵌入到其他多个(父)JS应用程序中。某些父应用可以通过将display:block / none设置为包含我的应用的某个元素来显示/隐藏我的应用。其他父应用程序暂时从DOM中删除我的应用程序并稍后重新附加。很少有父应用程序使用shadow dom,因此我无法访问父应用程序中的元素。

我需要一种方法来检查我的应用是否可见(在DOM内部并显示;不关心可见性:隐藏且不必在视口内),而不更改父应用,所以我调查了 getBoundingClientRect

问题: 至少在chrome上, getBoundingClientRect 返回(w:0,h:0,l:0,t:0),如果元素或其祖先有display:none或者从DOM中删除它。我找不到关于这种行为保证的任何文档,我想知道,如果使用getBoundingClientRect来检查元素的可见性是否安全(在某种意义上这个逻辑不会改变)。

此外,我需要知道这种行为是否在所有主流浏览器中都是一致的,包括FF,IE8 +和Safari。这是在任何地方记录的吗?

最后,为什么(0,0,0,0)?我觉得 getBoundingClientRect 应该在这种情况下返回null,因为(0,0,0,0)实际上意味着不同的东西。有这么好的理由吗?


已编辑/其他问题: 感谢istos指出返回null可能会破坏一些毫无疑问的代码,例如:

console.log(clientRectObject.height);
// TypeError: Cannot read property 'height' of null

不要抱怨当前的行为,而是作为一个设计问题:而不是null,可以返回一些非法的Rect值(例如负宽度和高度)是一个更有用的替代方案吗?

1 个答案:

答案 0 :(得分:3)

首先,我将研究像jQuery这样流行的库如何解决类似的问题。以下是jQuery源码的一些链接:

我还会在网上搜索任何线索,包括MDN:

不幸的是,在大多数浏览器中检查getBoundingClientRect的行为是否相同的最佳方法是在这些浏览器中进行实际测试。如果您这样做,请返回MDN并添加您的发现。


  

我觉得getBoundingClientRect应该在这种情况下返回null

虽然在这种情况下返回null似乎是合乎逻辑的,但它实际上并不理想,因为通常它返回一个具有top,right,bottom,left,width和height属性的 ClientRect 对象,像这样的代码会破坏:

console.log(clientRectObject.height);
// TypeError: Cannot read property 'height' of null

换句话说,API不会那样一致。