我在项目开发过程中遇到了一个问题,它与getBoundingClientRect
调试期间有和没有预防性断点的值之间的差异有关。为了尽量减少复制,我得到了关注。
const scrollHandler = () => {
setTimeout(() => {
const top = document.getElementById('test').getBoundingClientRect().top;
console.log(top);
});
};
document.getElementById('viewport').addEventListener('scroll', scrollHandler);
其中viewport
只是具有固定高度的可滚动div。的内容viewport
足够大,可以触发至少一个滚动事件。我还创建了Plunker 演示。所有的魔法都发生在setTimeout
回调内部。
现在是步骤。成功场景。
setTimeout
在回调开始时设置断点。- 触发滚动事件。
- 让“跨过”来获得
top
价值。 document.getElementById('test').getBoundingClientRect().top
在控制台中执行。- 3和4的结果是一样的。
失败的场景。
setTimeout
在回调结束时设置断点。- 触发滚动事件。
- 获取
top
变量的值(无需任何操作)。 document.getElementById('test').getBoundingClientRect().top
在控制台中执行。- 3和4的结果不一样。
为了避免对这个再现产生任何误解,我用上述步骤录制了一个简短的演示电影。
在我的项目中,我在类似的环境(节流滚动事件)中进行计算,并得到与预期不符的错误结果。但是当我调试它时,我得到了不同的画面;预防性断点修复计算。
是错误还是已知问题?还是我错过了什么?我应该拒绝getBoundingClientRect
在这种情况下使用吗?