我对编程比较陌生,并且正在开发带有弹出窗口的 Chrome 扩展程序。我想保存弹出调用之间的滚动位置。似乎我在互联网上找到了很多信息,但到目前为止我还没有能够解决我的问题。保存滚动位置几乎可以在我的扩展中使用,但我看到了 2 个问题:
1)要在每个滚动事件中保存滚动位置,我使用:
addEventListener('scroll', function(){
localStorage.scrollTop = document.body.scrollTop;
});
当弹出窗口打开时,我使用:
document.body.scrollTop = localStorage.scrollTop
这似乎工作正常,直到我的滚动位置超过弹出高度。Chrome 扩展中可见内容的最大弹出高度为 600 像素。document.body.style.height
也始终是大于 600px 的固定值。当滚动位置大于document.body.style.height
- 600px,比如 900px - 600px,document.body.scrollTop
重置为 300px。即使document.body.scrollTop
在弹出窗口关闭之前最后滚动位置 ( ) 是 400 像素,当重新打开弹出窗口时,滚动位置也会重置为 300 像素。显然,我得到了错误的滚动位置,因为正确的滚动位置值 400px(例如)然后被 300px 覆盖。
然而,它并不总是发生。有时我可以正确保存滚动位置,例如 500 像素,窗口高度为 900 像素,而其他时候我不能。我不确定为什么这会产生任何影响,但是随着弹出窗口中的内容更高,问题似乎神奇地消失了,并且保存了正确的滚动位置。
在这种情况下滚动位置时如何正确保存滚动位置?也许我在做一些根本错误的事情?
(这似乎令人困惑。我希望可以对上面的代码有所帮助。)
2)我认为可能与上述问题交织在一起,但我不确定。对于每个滚动事件(本文中的第一个代码块),我看到触发了一对滚动事件。
如果我只是打开弹出窗口但不滚动鼠标滚轮,我会看到事件侦听器中的代码触发。当第一个事件发生时,document.body.scrollTop
重置为“错误”值(在上面的示例中为 300px)。我认为这可能是这两个问题的根本原因。
事件监听器不应该只在鼠标滚轮被移动时触发,因此如果弹出窗口打开但鼠标滚轮未被触摸,事件监听器内的代码不会执行?