为了账号安全,请及时绑定邮箱和手机立即绑定

setTimeout() 在 hasFocus() 内部时不起作用

setTimeout() 在 hasFocus() 内部时不起作用

慕虎7371278 2023-08-18 16:16:24
下面的代码在30s用户进入页面 30 秒后发送 Google Analytics 事件。setTimeout(function(){    gtag('event', '30s'); }, 30000);但是当用户最小化窗口时,该事件仍然会触发。我真正想要的是一种在用户最小化页面时“暂停”的方法setTimeout,并且当用户最大化页面时,setTimeout从停止的那一刻起继续计数。我试图将声明放入setTimeout其中hasFocus,但它没有按预期工作。有办法做到吗?
查看完整描述

2 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

您可以使用页面可见性 API来检测页面焦点何时丢失。隐藏时,清除现有超时,并将剩余时间设置为变量;显示时,设置setTimeout剩余时间。大致如下:

let run = false;

const fn = () => {

  gtag('event', '30s');

  run = true;

};

let timeoutId;

let runAt;

let timeLeft = 30_000;

const resume = () => {

  runAt = Date.now() + timeLeft;

  timeoutId = setTimeout(fn, timeLeft);

};

resume();


document.addEventListener('visibilitychange', () => {

  if (document.hidden) {

    timeLeft = runAt - timeLeft;

    clearTimeout(timeoutId);

  } else if (!run) {

    resume();

  }

});


查看完整回答
反对 回复 2023-08-18
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

您可以使用 document.hidden:


setInterval(() => console.log(document.hidden), 1000)


查看完整回答
反对 回复 2023-08-18
  • 2 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信