Javascript 当document.hidden为true时,Chrome中未触发滚动事件。有解决办法吗?
当页面隐藏时,Chrome不会触发scroll事件,尽管页面实际上正在滚动。这看起来像是他们为了减少不可见页面的cpu和网络使用而实现的 即使使用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
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();}