Javascript 当document.hidden为true时,Chrome中未触发滚动事件。有解决办法吗?

Javascript 当document.hidden为true时,Chrome中未触发滚动事件。有解决办法吗?,javascript,google-chrome,dom,visibilitychange,Javascript,Google Chrome,Dom,Visibilitychange,当页面隐藏时,Chrome不会触发scroll事件,尽管页面实际上正在滚动。这看起来像是他们为了减少不可见页面的cpu和网络使用而实现的 即使使用Chrome的标志或扩展,也有办法解决这种行为吗?我需要触发“滚动”事件,因为这就是我正在测试的 setInterval(() => { window.scrollBy(0, 100); // scrolls indefinitely even when the page is hidden }, 1000); addEvent

当页面隐藏时,Chrome不会触发scroll事件,尽管页面实际上正在滚动。这看起来像是他们为了减少不可见页面的cpu和网络使用而实现的

即使使用Chrome的标志或扩展,也有办法解决这种行为吗?我需要触发“滚动”事件,因为这就是我正在测试的

setInterval(() => {
    window.scrollBy(0, 100);
    // scrolls indefinitely even when the page is hidden
}, 1000);

addEventListener("scroll", () => {
    console.log("scroll " + document.documentElement.scrollTop);
    // however, this gets fired only if document.hidden is false
});


这实际上是符合规范的

滚动事件将作为事件循环步骤的一部分触发。此更新渲染可以按照其步骤2至5进行简化,其中浏览器可以在认为渲染无用时(例如,当文档隐藏时)自由放弃渲染

因此,即使滚动确实发生了,因为渲染还没有发生,所以没有要触发的事件

注意:在Firefox中,添加对
requestAnimationFrame
的调用将强制触发事件几秒钟,但很快就会显示Chrome阻止所有rAF调用的行为,直到文档再次可见

解决这个问题取决于你的具体情况

如果您可以控制滚动条的来源,就像您的示例中一样,那么您可以自己启动滚动条,甚至不需要事件

setInterval(()=>{
滚动窗口(0,100);
log(“scroll”+document.documentElement.scrollTop);
}, 1000);

:root{height:100000vh}
谢谢。我很难强制触发滚动事件。我试图覆盖可见性api、document.hidden等的getter,但没有成功。事实上,如果document.hidden为真,即使我自己触发该事件,有些事情也不太有效。我不确定是否理解您的意思。您不需要重写“visibility api”的getter,您可能需要重写滚动api方法和setter(scrollTop等)。对于可见性,只检查
if(document.hidden){yourCallback();}