当前位置: 首页 > 面试题库 >

当Chrome中的标签页处于非活动状态时,如何使setInterval也起作用?

狄高畅
2023-03-14
问题内容

setInterval每秒要运行30次代码。这很好用,但是当我选择另一个选项卡(使带有我的代码的选项卡变为不活动状态)时,由于setInterval某种原因,该选项卡被设置为空闲状态。

var $div = $('div');
var a = 0;

setInterval(function() {
    a++;
    $div.css("left", a)
}, 1000 / 30);

如果运行此代码,然后切换到另一个选项卡,请等待几秒钟,然后返回,动画将继续到切换到另一个选项卡时的位置。因此,如果该选项卡处于非活动状态,则动画不会每秒运行30次。可以通过计算setInterval每秒调用该函数的次数来确认这一点-
如果选项卡处于非活动状态,则不是30,而是1或2。

我想这是设计使然,以提高性能,但是有什么办法可以禁用这种行为?在我的情况下,这实际上是一个缺点。


问题答案:

在大多数浏览器中,非活动选项卡的优先级较低,这可能会影响JavaScript计时器。

如果过渡的值是使用 帧之间的实时时间而不是每个间隔的固定增量来计算的,那么您不仅可以解决此问题,而且可以通过使用requestAnimationFrame获得更流畅的动画,因为如果不使用处理器,它可以达到60fps很忙。

这是一个使用动画属性过渡的requestAnimationFrame原始JavaScript示例:

var target = document.querySelector('div#target')

var startedAt, duration = 3000

var domain = [-100, window.innerWidth]

var range = domain[1] - domain[0]



function start() {

  startedAt = Date.now()

  updateTarget(0)

  requestAnimationFrame(update)

}



function update() {

  let elapsedTime = Date.now() - startedAt



  // playback is a value between 0 and 1

  // being 0 the start of the animation and 1 its end

  let playback = elapsedTime / duration



  updateTarget(playback)



  if (playback > 0 && playback < 1) {

    // Queue the next frame

    requestAnimationFrame(update)

  } else {

    // Wait for a while and restart the animation

    setTimeout(start, duration/10)

  }

}



function updateTarget(playback) {

  // Uncomment the line below to reverse the animation

  // playback = 1 - playback



  // Update the target properties based on the playback position

  let position = domain[0] + (playback * range)

  target.style.left = position + 'px'

  target.style.top = position + 'px'

  target.style.transform = 'scale(' + playback * 3 + ')'

}



start()


body {

  overflow: hidden;

}



div {

    position: absolute;

    white-space: nowrap;

}


<div id="target">...HERE WE GO</div>

对于后台任务(与UI无关)

评论:

对于演示文稿问题很好,但是仍然需要保持一些运行状态。

如果您有需要按给定间隔精确执行的后台任务,则可以使用HTML5WebWorkers。有关更多详细信息,请查看下面的Möhre答案 …

CSS vs JS“动画”

通过使用CSS过渡/动画而不是基于JavaScript的动画,可以避免此问题以及许多其他问题,这会增加相当大的开销。我建议使用这个jQuery插件,让您像animate()方法一样从CSS转换中受益。



 类似资料:
  • 问题内容: 从MDN for NodeList: 在某些情况下,NodeList是一个实时集合,这意味着DOM中的更改会反映在集合中。例如,Node.childNodes处于活动状态: 在其他情况下,NodeList是静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。 所以....有点烦!是否有任何关于哪些

  • 问题内容: 是否有可能使MySQL中的行处于非活动状态?因此,该行不再用于查询结果吗?我的客户希望保留删除的成员在数据库中的存在,但是我不想编辑所有查询以检查该成员是否被删除。 还是有一种简单的方法将整个行数据移动到另一个“非活动”表中? 问题答案: 您可以重命名当前表,在其中创建“ deleted”列,然后创建一个与当前表同名的视图,并选择“ deleted = 0”。这样,您不必更改所有查询。

  • 我正在Android上使用Firebase云消息。 当应用程序位于前台时,我可以成功接收通知和数据消息 文档说明,如果在应用程序处于后台时收到通知消息,则Firebase将代表应用程序向系统托盘发送通知。这对我不起作用 如果发送了数据消息且应用程序位于后台,则会成功调用onMessageReceived方法 最麻烦的情况是,我强制停止应用程序,然后尝试发送通知或数据消息。在这种情况下,不会调用on

  • 问题内容: 我有一个每秒调用一次的函数,仅当当前页面位于前台时才运行,即用户没有最小化浏览器或切换到另一个选项卡。如果用户不看它,它是没有用的,并且可能占用大量CPU,因此我不想只在后台浪费时间。 有人知道如何用JavaScript讲这个吗? 注意:我使用jQuery,因此,如果您的答案使用了jQuery,那就好了:)。 问题答案: 您将使用窗口的和事件: 要回答“ Double Fire”的评论

  • 我正在寻找一种方法,显示一个div时,一个锚点被点击。我在我的页面上有一个HTML5/PHP表单,当提交时,它会将用户带着一条谢谢消息带到div中放置的锚,这是激活该链接的唯一方法。这是我试图显示的div: 当锚点处于活动状态时,是否有一种方法可以改变(可能使用CSS)显示:none?

  • 那么我应该做些什么来实现这个目标呢?如有任何帮助/线索,请提前感谢