javascript - 当用户离开选项卡时暂停的 setInterval()?

标签 javascript

javascript 中是否有任何方法的行为类似于 setInterval() 并且会在用户离开选项卡时停止并在用户再次进入选项卡时恢复?

最佳答案

您可以创建自己的 API,使用 Visibility API检测选项卡何时可见或隐藏,并在后台调用 native setIntervalclearInterval

var mySetInterval, myClearInterval;
(function() {
  var data = Object.create(null),
      id = 0;
  mySetInterval = function mySetInterval(func, time) {
    data[id] = {
      nativeID: setInterval(func, time),
      func: func,
      time: time
    };
    return id++;
  };
  myClearInterval = function myClearInterval(id) {
    if(data[id]) {
      clearInterval(data[id].nativeID);
      delete data[id];
    }
  };
  document.addEventListener('visibilitychange', function() {
    if(document.visibilityState == 'visible')
      for(var id in data)
        data[id].nativeID = setInterval(data[id].func, data[id].time);
    else
      for(var id in data)
        clearInterval(data[id].nativeID);
  });
})();

var mySetInterval, myClearInterval;
(function() {
  var data = Object.create(null),
      id = 0;
  mySetInterval = function mySetInterval(func, time) {
    data[id] = {
      nativeID: setInterval(func, time),
      func: func,
      time: time
    };
    return id++;
  };
  myClearInterval = function myClearInterval(id) {
    if(data[id]) {
      clearInterval(data[id].nativeID);
      delete data[id];
    }
  };
  document.addEventListener('visibilitychange', function() {
    if(document.visibilityState == 'visible')
      for(var id in data)
        data[id].nativeID = setInterval(data[id].func, data[id].time);
    else
      for(var id in data)
        clearInterval(data[id].nativeID);
  });
})();

var log = document.getElementById('log'),
    timer;
document.getElementById('start').onclick = function() {
  var num = 0;
  myClearInterval(timer);
  timer = mySetInterval(function(){
    log.innerHTML = num++;
  }, 1e3);
};
<input id="start" type="button" value="Start" />
<span id="log"></span>

请注意,上面的 API 不应与 native API 混合使用,例如不要尝试使用 mySetInterval 创建并使用 clearInterval 清除。因此,mySetInterval 返回的 ID 故意与 native ID 不同。

关于javascript - 当用户离开选项卡时暂停的 setInterval()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28862259/

相关文章:

javascript - 将新值推送到对象数组,同时保持旧值完好无损 React Js Next Js

javascript - 导航按钮未重置为非事件状态

javascript - 预加载器继续加载并且在加载内容时不会消失

javascript - 一个模态如何重新打开另一个模态? ( Angular 4+)

javascript - 如何将可观察到的 Angular 与数组匹配

用于切换多个 css 动画的 Javascript 按钮

javascript - Highcharts - 突出显示范围内的鼠标位置

javascript - 使用 JQuery Sortable 插件防止表格的标题可排序

javascript - plotly :如何丢弃旧点?

javascript - 使用新的 div 网格刷新页面