千家信息网

如何使用JavaScript检测空闲的浏览器选项卡

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,今天就跟大家聊聊有关如何使用JavaScript检测空闲的浏览器选项卡,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在某些情况下,当用户与我们
千家信息网最后更新 2025年02月02日如何使用JavaScript检测空闲的浏览器选项卡

今天就跟大家聊聊有关如何使用JavaScript检测空闲的浏览器选项卡,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

在某些情况下,当用户与我们的最终产品或应用程序进行交互时,我们发现自己会执行许多密集的,占用大量CPU的任务。启动轮询器,建立WebSocket连接,甚至加载视频或图片等媒体,都有可能成为性能障碍,尤其是当这些任务在不需要的情况下消耗资源的时候。在用户没有主动与界面交互的同时,从不必要的工作负载或网络请求中释放主线程是一个非常好的和有意义的实践。换一种方式,在大多数主机提供商都在引入基于配额的定价模式的行业中,减少网络请求也可以降低运行应用程序或服务的成本。

页面可见性(Page Visibility) API

所有现代的网页浏览器都加入了页面可见性API,它允许我们检测浏览器的标签页何时被隐藏,此外,我们还可以注册一个事件监听器,以检测可见性变化时的信号。

document.visibilityState

当页面处于前台时,document.visibilityState 可能是 visible ,最小化窗口的"标签"或隐藏。

我们可以通过以下方式直接访问 document.visibilityState:

console.log(document.visibilityState); // => 它可以是"visible"或"hidden"

visibilitychange Event

我们还可以使用事件侦听器轻松检测可见性属性中的更改。

const onVisibilityChange = () => {   if (document.visibilityState === 'hidden') {     console.log('> 这个窗口是隐藏的.');   } else {     console.log('> 这个窗口是可见的.');   } }; document.addEventListener('visibilitychange', onVisibilityChange, false);

轮询示例

考虑一种情况,在这种情况下,我们正在轮询API以获取更新,并且希望避免对空闲用户进行不必要的调用。一个简化的示例如下所示:

const poll = () => {   const interval = 1500;   let _poller = null;   const repeat = () => {     console.log(`~ Polling: ${Date.now()}.`);   };    return {     start: () => {       _poller = setInterval(repeat, interval);     },     stop: () => {       console.log('~ Poller stopped.');       clearInterval(_poller);     }   }; };  const poller = poll(); poller.start();  const onVisibilityChange = () => {   if (document.visibilityState === 'hidden') {     poller.stop();   } else {     poller.start();   } };  document.addEventListener('visibilitychange', onVisibilityChange, false);

在后台异步加载

但有时我们可以通过反其道而行之,加速用户的终端体验。我们可以异步加载外部依赖或资产,而不是取消所有的作业和请求。这样,当用户回来时,他们的最终体验将更加"充实"并且丰富。

/ Webpack /

使用ES2015动态导入建议和适当的Webpack配置清单,我们可以轻松地在后台加载额外的模块或资产。

let loaded = false; const onVisibilityChange = () => {   if (document.visibilityState === 'hidden') {     // Aggresively preload external assets ans scripts     if (loaded) {       return;     }     Promise.all([       import('./async.js'),       import('./another-async.js'),       import(/* webpackChunkName: "bar-module" */ 'modules/bar'),       import(/* webpackPrefetch: 0 */ 'assets/images/foo.jpg')     ]).then(() => {       loaded = true;     });   } };  document.addEventListener('visibilitychange', onVisibilityChange, false);

/ Rollup /

Rollup还支持开箱即用的动态导入。

let loaded = false; const onVisibilityChange = () => {   if (document.visibilityState === 'hidden') {     // Aggresively preload external assets ans scripts     if (loaded) {       return;     }     Promise.all([       import('./modules.js').then(({default: DefaultExport, NamedExport}) => {         // do something with modules.       })     ]).then(() => {       loaded = true;     });   } };  document.addEventListener('visibilitychange', onVisibilityChange, false);

/ 用Javascript预加载 /

除了使用捆绑器,我们还可以仅使用几行JavaScript来预加载静态资源(例如图像)。

let loaded = false;  const preloadImgs = (...imgs) => {   const images = [];   imgs.map(     url =>       new Promise((resolve, reject) => {         images[i] = new Image();         images[i].src = url;         img.onload = () => resolve();         img.onerror = () => reject();       })   ); };  const onVisibilityChange = () => {   if (document.visibilityState === 'hidden') {     // Aggresively preload external assets ans scripts     if (loaded) {       return;     }     Promise.all(       preloadImgs(         'https://example.com/foo.jpg',         'https://example.com/qux.jpg',         'https://example.com/bar.jpg'       )     )       .then(() => {         loaded = true;       })       .catch(() => {         console.log('> Snap.');       });   } };  document.addEventListener('visibilitychange', onVisibilityChange, false);

微互动

最后,一种吸引用户注意力的巧妙方法是动态更改图标,只需使用几个像素就可以保持交互。

const onVisibilityChange = () => {   const favicon = document.querySelector('[rel="shortcut icon"]');   if (document.visibilityState === 'hidden') {     favicon.href = '/come-back.png';   } else {     favicon.href = '/example.png';   } };  document.addEventListener('visibilitychange', onVisibilityChange, false);

看完上述内容,你们对如何使用JavaScript检测空闲的浏览器选项卡有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

用户 检测 浏览器 浏览 情况 空闲 内容 动态 页面 事件 任务 可以通过 后台 应用程序 方式 标签 示例 程序 网络 行业 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全与治理漫谈 定制软件开发二次开发费用 黑龙江旅游职业技术学院网络技术 运转灵活眼镜行业软件开发 jndi数据库连接池释放 重邮的网络安全专业如何 数据库hr模式 新华区新时代软件开发服务供应 服务器怎么禁止海外访问 魔兽9.1部落哪个服务器人多 2021郑州网络安全会议 核酸检测统计系统数据库设计 数据库有几种基本类型 常州助力智慧小区软件开发 微信图像存入数据库 作为一名公民如何维护网络安全 现代化网络技术批量定制 魔兽数据库 军团再临 服务器显卡配置 瀚云科技工业互联网平台 免费实时数据库软件 关于网络安全利与弊的手抄报 成都网络安全评测公司 2012服务器文件共享 服务器7222报错 个旧市委网络安全宣传周 智联网络技术公司 浅谈计算机网络安全与防范翻译 军民融合网络安全饶志宏 腾讯云服务器如何更改配置
0