返回顶部
首页 > 资讯 > 精选 >javascript定时器在页面最小化时不执行怎么实现
  • 612
分享到

javascript定时器在页面最小化时不执行怎么实现

2023-07-02 17:07:41 612人浏览 安东尼
摘要

这篇文章主要讲解了“javascript定时器在页面最小化时不执行怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript定时器在页面最小化时不执行怎么实现”吧!useIn

这篇文章主要讲解了“javascript定时器在页面最小化时不执行怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript定时器在页面最小化时不执行怎么实现”吧!

    useInterval 和 useTimeout

    看名称,我们就能大概知道,它们的功能对应的是 setInterval 和 setTimeout,那对比后者有什么优势?

    先看 useInterval,代码简单,如下所示:

    function useInterval(  fn: () => void,  delay: number | undefined,  options?: {    immediate?: boolean;  },) {  const immediate = options?.immediate;  const fnRef = useLatest(fn);  useEffect(() => {    // 忽略部分代码...    // 立即执行    if (immediate) {      fnRef.current();    }    const timer = setInterval(() => {      fnRef.current();    }, delay);    // 清除定时器    return () => {      clearInterval(timer);    };    // 动态修改 delay 以实现定时器间隔变化与暂停。  }, [delay]);}

    跟 setInterval 的区别如下:

    • 可以支持第三个参数,通过 immediate 能够立即执行我们的定时器。

    • 在变更 delay 的时候,会自动清除旧的定时器,并同时启动新的定时器。

    • 通过 useEffect 的返回清除机制,开发者不需要关注清除定时器的逻辑,避免内存泄露问题。这点是很多开发者会忽略的点。

    useTimeout 跟上面很类似,如下所示,不再做额外解释:

    function useTimeout(fn: () => void, delay: number | undefined): void {  const fnRef = useLatest(fn);  useEffect(() => {    // ...忽略部分代码    const timer = setTimeout(() => {      fnRef.current();    }, delay);    return () => {      clearTimeout(timer);    };  // 动态修改 delay 以实现定时器间隔变化与暂停。  }, [delay]);}

    setTimeout 和 setInterval 的问题

    首先,setTimeout 和 setInterval 作为事件循环中宏任务的“两大主力”,它的执行时机不能跟我们预期一样准确的,它需要等待前面任务的执行。比如下面的 setTimeout 的第二个参数设置为 0,并不会立即执行。

    setTimeout(() => {  console.log('test');}, 0)

    另外还有一种情况,setTimeout 和 setInterval 在浏览器不可见的时候(比如最小化的时候),不同的浏览器中设置不同的时间间隔的时候,其表现不一样。根据 当浏览器切换到其他标签页或者最小化时,你的js定时器还准时吗? 结论如下:

    谷歌浏览器中,当页面处于不可见状态时,setInterval 的最小间隔时间会被限制为 1s。火狐浏览器的 setInterval 和谷歌特性一致,但是 ie 浏览器没有对不可见状态时的 setInterval 进行性能优化,不可见前后间隔时间不变。

    在谷歌浏览器中,setTimeout在浏览器不可见状态下间隔低于1s的会变为1s,大于等于1s的会变成N+1s的间隔值。火狐浏览器下setTimeout的最小间隔时间会变为1s,大于等于1s的间隔不变。ie浏览器在不可见状态前后的间隔时间不变。

    这个结论,我没有验证过,但看起来差异挺大,其中还提到了另外一个选择,就是 requestAnimationFrame。

    window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行

    为了提高性能和电池寿命,因此在大多数浏览器里,当requestAnimationFrame() 运行在后台标签页或者隐藏的 <iframe> 里时,requestAnimationFrame() 会被暂停调用以提升性能和电池寿命

    所以,ahooks 也提供了使用 requestAnimationFrame 进行模拟定时器处理的 hook,我们一起来看下。

    useRafInterval 和 useRafTimeout

    直接看 useRafInterval。(useRafTimeout 和 useRafInterval 类似,这里不展开细说)。

    function useRafInterval(  fn: () => void,  delay: number | undefined,  options?: {    immediate?: boolean;  },) {  const immediate = options?.immediate;  const fnRef = useLatest(fn);  useEffect(() => {    // 省略部分代码...    const timer = setRafInterval(() => {      fnRef.current();    }, delay);    return () => {      clearRafInterval(timer);    };  }, [delay]);}

    可以看到,跟前面的 useInterval 大部分代码逻辑都是一样的,只是定时使用了 setRafInterval 方法,清除定时器用了 clearRafInterval

    setRafInterval

    直接上代码:

    const setRafInterval = function (callback: () => void, delay: number = 0): Handle {  if (typeof requestAnimationFrame === typeof undefined) {    // 如果不支持,还是使用 setInterval    return {      id: setInterval(callback, delay),    };  }  // 开始时间  let start = new Date().getTime();  const handle: Handle = {    id: 0,  };  const loop = () => {    const current = new Date().getTime();    // 当前时间 - 开始时间,大于设置的间隔,则执行,并重置开始时间    if (current - start >= delay) {      callback();      start = new Date().getTime();    }    handle.id = requestAnimationFrame(loop);  };  handle.id = requestAnimationFrame(loop);  return handle;};

    首先是用 typeof 判断进行兼容逻辑处理,假如不兼容,则兜底使用 setInterval。

    初始记录一个 start 的时间。

    在 requestAnimationFrame 回调中,判断现在的时间减去开始时间有没有达到间隔,假如达到则执行我们的 callback 函数。更新开始时间。

    clearRafInterval

    清除定时器。

    function cancelAnimationFrameIsNotDefined(t: any): t is nodejs.Timer {  return typeof cancelAnimationFrame === typeof undefined;}// 清除定时器const clearRafInterval = function (handle: Handle) {  if (cancelAnimationFrameIsNotDefined(handle.id)) {    return clearInterval(handle.id);  }  cancelAnimationFrame(handle.id);};

    假如不支持 cancelAnimationFrame api,则通过 clearInterval 清除,支持则直接使用 cancelAnimationFrame 清除。

    感谢各位的阅读,以上就是“javascript定时器在页面最小化时不执行怎么实现”的内容了,经过本文的学习后,相信大家对javascript定时器在页面最小化时不执行怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: javascript定时器在页面最小化时不执行怎么实现

    本文链接: https://lsjlt.com/news/343351.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • javascript定时器在页面最小化时不执行怎么实现
      这篇文章主要讲解了“javascript定时器在页面最小化时不执行怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript定时器在页面最小化时不执行怎么实现”吧!useIn...
      99+
      2023-07-02
    • 定时器在页面最小化时不执行实现示例
      目录引言useInterval 和 useTimeoutsetTimeout 和 setInterval 的问题useRafInterval 和 useRafTimeoutsetRa...
      99+
      2024-04-02
    • javascript怎么实现定时跳转页面
      本篇内容介绍了“javascript怎么实现定时跳转页面”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
      99+
      2024-04-02
    • 怎么实现在页面加载之后执行JavaScript
      这篇文章主要介绍“怎么实现在页面加载之后执行JavaScript”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么实现在页面加载之后执行JavaScript”文章能帮助大家解决问题。我们都知道,页面...
      99+
      2023-06-30
    • 在PHP中怎么实现定时执行方法
      这篇文章主要讲解了“在PHP中怎么实现定时执行方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在PHP中怎么实现定时执行方法”吧!一、使用sleep函数首先,我们可以使用PHP的sleep...
      99+
      2023-07-05
    • mysql中怎么实现定时执行
      mysql中怎么实现定时执行,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。5.1版本以后,MYSQL支持定时执行(event)的功能,就跟...
      99+
      2024-04-02
    • android定时执行任务怎么实现
      Android定时执行任务可以通过以下几种方式实现:1. 使用Handler和Timer:创建一个Handler对象,在Handle...
      99+
      2023-09-21
      android
    • php怎么实现定时执行任务
      在PHP中,可以使用以下几种方法来实现定时执行任务:1. 使用cron表达式:cron表达式是一种常用的定时任务调度语法,可以在操作...
      99+
      2023-08-12
      php
    • javascript中怎么让定时器刷新页面
      这篇文章给大家分享的是有关javascript中怎么让定时器刷新页面的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。给大家总结定时器刷新的三种方法方法一:添加 setInterval()函数<script&n...
      99+
      2023-06-14
    • 怎么查看JavaScript定时器的执行情况
      这篇“怎么查看JavaScript定时器的执行情况”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么查看JavaScript...
      99+
      2023-07-06
    • 怎么在shell实现定时周期性执行脚本
      这期内容当中小编将会给大家带来有关怎么在shell实现定时周期性执行脚本,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。示例编写测试脚本脚本 time .sh$ cat time.sh&...
      99+
      2023-06-09
    • javascript怎么实现简单页面倒计时
      小编给大家分享一下javascript怎么实现简单页面倒计时,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体如下:<!DOCTYPE html><html><head>&nb...
      99+
      2023-06-06
    • java定时执行某个方法怎么实现
      在Java中,可以使用Timer和TimerTask类来实现定时执行某个方法。首先,创建一个继承自TimerTask的类,重写run...
      99+
      2023-10-20
      java
    • Laravel每秒执行定时任务怎么实现
      这篇文章主要介绍“Laravel每秒执行定时任务怎么实现”,在日常操作中,相信很多人在Laravel每秒执行定时任务怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Laravel每秒执行定时任务怎么实现...
      99+
      2023-07-04
    • layui如何实现多iframe页面控制定时器运行
      这篇文章主要为大家展示了“layui如何实现多iframe页面控制定时器运行”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“layui如何实现多iframe页面控...
      99+
      2024-04-02
    • .NET怎么使用System.Timers.Timer类实现程序定时执行
      这篇文章主要讲解了“.NET怎么使用System.Timers.Timer类实现程序定时执行”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET怎么使用System.Timers.Time...
      99+
      2023-07-02
    • C语言操作时间函数之怎么实现定时执行某个任务小程序
      本篇内容主要讲解“C语言操作时间函数之怎么实现定时执行某个任务小程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言操作时间函数之怎么实现定时执行某个任务小程序”吧!时间概述由上图可知:通过...
      99+
      2023-06-16
    • 使用javascript怎么实现一个定时器倒计时功能
      这期内容当中小编将会给大家带来有关使用javascript怎么实现一个定时器倒计时功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。<!DOCTYPE html><html&n...
      99+
      2023-06-14
    • Jackson反序列化时怎么实现大小写不敏感设置
      这篇文章主要讲解了“Jackson反序列化时怎么实现大小写不敏感设置”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Jackson反序列化时怎么实现大小写不敏感设置”吧!常用配置ObjectM...
      99+
      2023-06-20
    • uniapp 小程序实时且持续获取定位信息(全局设置一次)(单页面监听定位改变)(不采用定时器)
      本篇文章实现了uniapp 微信小程序实时获取定位信息,小程序打开即可持续获取定位信息, 位置更新也会触发相关自定义事件 tips: 如果需要做成区分登录状态的 看这篇优化后的文章: uniapp 持续获取定位(登录状态下才获取)(不采用定...
      99+
      2023-08-31
      uni-app 小程序 前端
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作