我的项目中有几个 setTimeout 函数,每个函数都有一个 setInterval。
根据我所经历的,当我离开窗口时 setInterval 会停止,但是,setTimeout 不会停止计算秒数。
当有人离开当前窗口(切换到另一个窗口)时,是否可以暂停 setTimeout 的计时器并在他返回时继续它?如果是,如何?
这是我设法创建的代表我的问题的代码:
// find elements
var banner = $("#banner-message")
var banner2 = $("#banner-message2")
var banner3 = $("#banner-message3")
var num = 0;
var num2 = 0;
var num3 = 0;
var i1 = setInterval(function() {
num++;
$(banner).text(num);
if (num >= 100)
{
clearInterval(i1);
}
}, 50);
setTimeout(function()
{
var i2 = setInterval(function() {
num2++;
$(banner2).text(num2);
if (num2 >= 100)
{
clearInterval(i2);
}
}, 50);
}, 5500);
setTimeout(function()
{
var i3 = setInterval(function() {
num3++;
$(banner3).text(num3);
if (num3 >= 100)
{
clearInterval(i3);
}
}, 50);
}, 11000);Run Code Online (Sandbox Code Playgroud)
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
#banner-message {
background: #fff;
border-radius: 4px;
padding: 20px;
font-size: 25px;
text-align: center;
transition: all 0.2s;
margin: 0 auto;
width: 300px;
}
#banner-message2 {
background: #fff;
border-radius: 4px;
padding: 20px;
font-size: 25px;
text-align: center;
transition: all 0.2s;
margin: 0 auto;
width: 300px;
}
#banner-message3 {
background: #fff;
border-radius: 4px;
padding: 20px;
font-size: 25px;
text-align: center;
transition: all 0.2s;
margin: 0 auto;
width: 300px;
}
button {
background: #0084ff;
border: none;
border-radius: 5px;
padding: 8px 14px;
font-size: 15px;
color: #fff;
}
#banner-message.alt {
background: #0084ff;
color: #fff;
margin-top: 40px;
width: 200px;
}
#banner-message.alt button {
background: #fff;
color: #000;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="banner-message">
0
</div>
<div id="banner-message2">
0
</div>
<div id="banner-message3">
0
</div>Run Code Online (Sandbox Code Playgroud)
您可以使用事件侦听器监视选项卡何时失去焦点visibilitychange。当可见性改变时,您可以使用document.hidden查看文档是否被隐藏。如果是,则可以清除超时。当它重新获得焦点时,您可以调用setTimeout恢复功能。
let myTimeout = null
function timeoutfunction() {
console.log('timeout called')
myTimeout = setTimeout(timeoutfunction, 1000)
}
function onVisibilityChanged() {
if (document.hidden || document.mozHidden || document.webkitHidden || document.msHidden) {
// The tab has lost focus
clearTimeout(myTimeout)
} else {
// The tab has gained focus
myTimeout = setTimeout(timeoutfunction, 1000)
}
}
document.addEventListener("visibilitychange", onVisibilityChanged, false);
document.addEventListener("mozvisibilitychange", onVisibilityChanged, false);
document.addEventListener("webkitvisibilitychange", onVisibilityChanged, false);
document.addEventListener("msvisibilitychange", onVisibilityChanged, false);
Run Code Online (Sandbox Code Playgroud)