javascript - 使用 Javascript 离开窗口时如何暂停 setTimeout?

标签 javascript

我的项目中有几个 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);
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;
}
<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>

最佳答案

您可以使用事件监听器 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);

关于javascript - 使用 Javascript 离开窗口时如何暂停 setTimeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54948840/

相关文章:

javascript - 如何从 JS ERB 中执行辅助方法?

javascript - 为什么 io 未定义?

javascript - 尝试解构可能长度为 2 的数组时出错

javascript - Sequelize : difference of DataTypes and Sequelize

javascript - localstorage如何保存按钮

javascript - vue.js 从表单选择中更新不同的模型

javascript - 检测折线是否与多边形相交

javascript - 如何使用 JavaScript pickatime 库设置时间

Javascript - 使用 Map 或过滤器根据值的存在返回数组成员的子集

javascript - 带有 asp.net 的 jQuery UI 对话框 - 对象不支持属性或方法 'dialog'