Javascript 页面未打开时暂停的超时';看不见

Javascript 页面未打开时暂停的超时';看不见,javascript,performance,Javascript,Performance,我希望有一个类似于setTimeout的计时器API,但不同的是当页面不活动/不可见时计时器会暂停 setActiveTimeout(function(){ alert('hi') }, 10000); 换句话说,如果用户在计时器运行五秒钟后切换到另一个选项卡,等待一个小时,然后切换回来,他们会在切换回来五秒钟后收到警报 原因是,a)节省CPU周期,b)当用户返回包含异步定期更新的页面时,不会出现“堆积”行为 我想我可以尝试使用新的页面可见性API或requestAnimationFrame(

我希望有一个类似于setTimeout的计时器API,但不同的是当页面不活动/不可见时计时器会暂停

setActiveTimeout(function(){ alert('hi') }, 10000);
换句话说,如果用户在计时器运行五秒钟后切换到另一个选项卡,等待一个小时,然后切换回来,他们会在切换回来五秒钟后收到警报

原因是,a)节省CPU周期,b)当用户返回包含异步定期更新的页面时,不会出现“堆积”行为

我想我可以尝试使用新的页面可见性API或requestAnimationFrame()或其组合来构建一个实现这类功能的库,但它似乎很复杂,我希望有人能想到一个简单的解决方案,或者一个实现这一功能的库


谢谢。

我会尝试在
模糊事件中停止计数器,然后在
焦点上重新启动:

window.onfocus = function(e) {
    // restart counter
    // I recommend setInterval
}

window.onblur = function(e) {
    // stop counter
    // with clearInterval
}

为了澄清这一点,本机setTimeout()的行为似乎不是这样的。当我切换回我的页面时,我肯定会看到更新堆积在我的页面上。看起来各种浏览器都会减慢计时器和/或延迟回调直到返回,但你没有得到我想要的暂停功能。考虑到setTimeout是一个通用函数,这似乎是合理的。我在我的代码中有足够多的地方这样做,我肯定想把它变成一个实用工具,这样我所有的计时器都可以集中管理。另外,我必须为剩余的时间设置超时,而不仅仅是重新启动它。这就是我所说的看起来可能,只是复杂。理想情况下,我在谷歌搜索中忽略了这方面的一些著名库:)在没有看到代码的情况下很难建议实现,但是为什么不使用
setInterval
和递增(或递减)计数器,而不是计算超时/间隔?你不能暂停js定时器…setInterval会重复运行,而我正在寻找setTimeout,它只运行一次。或者更可能的是我不理解你的建议。顺便说一句,暂停JS计时器正是我想要的;)我假设您也想进行某种可视化倒计时,这将需要setInterval(或者对setTimeout的回调再次调用setTimeout)。我知道你想暂停计时器,但你就是不能:(