背景: 我目前正在开发一个项目,我的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值(例如负宽度和高度)是一个更有用的替代方案吗?
答案 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不会那样一致。