首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

利用 Page Visibility API 优化网页性能与用户体验

编程知识
2024年09月29日 09:30

在现代 Web 开发中,用户可能会频繁切换标签页,或让网页处于后台运行。为了避免不必要的资源浪费并提升用户体验,合理利用 Page Visibility API 可以在页面不可见时暂停或减少资源的消耗,并在页面重新可见时恢复正常操作。

在这篇博客中,我将展示如何通过 Page Visibility API 实现以下场景:

  1. 当用户切换标签页时暂停视频或音频播放。
  2. 当页面不可见时停止资源密集型的动画。
  3. 页面不可见时停止 API 请求,并在页面可见时重新开始。
  4. 当用户返回页面时恢复定时操作。

什么是 Page Visibility API?

Page Visibility API 是一个浏览器提供的 API,它可以告诉我们页面的可见性状态。当页面变为不可见时,我们可以暂停一些不必要的操作,比如动画或媒体播放。这个 API 提供了两个核心功能:

  • document.hidden:返回一个布尔值,指示页面当前是否隐藏。
  • document.visibilityState:返回页面的可见性状态,可以是 'visible'(页面可见)、'hidden'(页面隐藏)或 'prerender'(页面正在预渲染)。
  • visibilitychange 事件:当页面的可见性状态(document.visibilityState)改变时触发。

visibilityState 的作用

document.visibilityState 提供比 document.hidden 更直观的信息。它不仅告诉你页面是否隐藏,还能进一步区分页面是否正在预渲染。例如,你可以根据不同的状态采取不同的优化措施。

浏览器兼容性

虽然 Page Visibility API 很有用,但它的兼容性在不同浏览器中略有差异。以下是各主流浏览器的支持情况:

Document.hiddendocument.visibilityState

浏览器 支持情况 版本
Chrome 支持 自 33 版本起
Firefox 支持 自 18 版本起
Safari 支持 自 7 版本起
Edge 支持 自 12 版本起
Opera 支持 自 20 版本起

visibilitychange 事件

浏览器 支持情况 版本
Chrome 支持 自 62 版本起
Firefox 支持 自 56 版本起
Safari 支持 自 14.1 版本起
Edge 支持 自 18 版本起
Opera 支持 自 49 版本起

用户切换标签页时暂停视频播放

当用户切换标签页时,继续播放视频会浪费带宽和资源。通过 Page Visibility API,可以在页面不可见时暂停视频,等用户返回后再自动恢复播放。

const videoElement = document.querySelector("video");

document.addEventListener("visibilitychange", function() {
    if (document.visibilityState === 'hidden') {
        // 页面隐藏时暂停视频
        videoElement.pause();
        console.log("页面隐藏,视频暂停");
    } else if (document.visibilityState === 'visible') {
        // 页面可见时恢复视频播放
        videoElement.play();
        console.log("页面可见,视频继续播放");
    }
});

页面不可见时停止资源密集型动画

动画可能是性能瓶颈,尤其是在页面不可见时运行动画毫无意义。通过 Page Visibility API,我们可以在页面不可见时暂停动画,减少 CPU 和 GPU 的消耗。

let animationRunning = true;

function startAnimation() {
    if (!animationRunning) return;
    // 假设这里有动画逻辑
    console.log("动画正在运行...");
    requestAnimationFrame(startAnimation);
}

document.addEventListener("visibilitychange", function() {
    if (document.visibilityState === 'hidden') {
        // 页面隐藏时停止动画
        animationRunning = false;
        console.log("页面隐藏,动画停止");
    } else if (document.visibilityState === 'visible') {
        // 页面可见时恢复动画
        animationRunning = true;
        startAnimation();
        console.log("页面可见,动画恢复");
    }
});

startAnimation();

页面不可见时停止 API 请求

某些情况下,持续的数据获取可能会浪费带宽。通过检测页面的可见性,可以在页面不可见时停止数据请求,优化带宽使用。

let requestInterval;

function startFetchingData() {
    requestInterval = setInterval(() => {
        // 模拟 API 请求
        console.log("正在获取数据...");
    }, 5000);
}

function stopFetchingData() {
    clearInterval(requestInterval);
    console.log("停止获取数据");
}

document.addEventListener("visibilitychange", function() {
    if (document.visibilityState === 'hidden') {
        // 页面隐藏时停止数据获取
        stopFetchingData();
    } else if (document.visibilityState === 'visible') {
        // 页面可见时恢复数据获取
        startFetchingData();
    }
});

startFetchingData();

页面可见时恢复定时操作

当页面不可见时,某些定时任务可以暂停,直到用户返回页面时再恢复执行。这有助于提升资源利用效率。

let intervalId;

function startTimer() {
    intervalId = setInterval(() => {
        console.log("计时器正在运行...");
    }, 1000);
}

function stopTimer() {
    clearInterval(intervalId);
    console.log("计时器停止");
}

document.addEventListener("visibilitychange", function() {
    if (document.visibilityState === 'hidden') {
        // 页面隐藏时停止计时器
        stopTimer();
    } else if (document.visibilityState === 'visible') {
        // 页面可见时恢复计时器
        startTimer();
    }
});

startTimer();

用户返回页面时恢复音频播放

与视频类似,音频在页面不可见时继续播放不仅对用户无意义,还会浪费系统资源。通过 Page Visibility API 可以在用户返回页面时恢复音频播放。

const audioElement = document.querySelector("audio");

document.addEventListener("visibilitychange", function() {
    if (document.visibilityState === 'hidden') {
        // 页面隐藏时暂停音频
        audioElement.pause();
        console.log("页面隐藏,音频暂停");
    } else if (document.visibilityState === 'visible') {
        // 页面可见时恢复音频播放
        audioElement.play();
        console.log("页面可见,音频继续播放");
    }
});

结论

Page Visibility API 是一个简单但非常有效的工具,能够让开发者根据页面的可见性来动态优化资源的使用。结合 document.visibilityState,你可以进一步细化页面状态的控制,如在页面预渲染时暂停某些操作。

这种优化不仅提升了用户体验,还能显著减少系统资源的浪费。通过合理利用这个 API,我们可以暂停后台的视频、音频、动画、数据请求等操作,并在用户重新关注页面时迅速恢复,达到性能和体验的双重提升。

在开发过程中,别忘了考虑浏览器的兼容性问题,确保在所有平台上提供一致的用户体验。希望这篇文章能够帮助你更好地掌握 Page Visibility API 并将其应用到实际项目中。

参考内容

From:https://www.cnblogs.com/guojikun/p/18439054
本文地址: http://www.shuzixingkong.net/article/2390
0评论
提交 加载更多评论
其他文章 SpringBoot+Docker +Nginx 部署前后端项目
部署SpringBoot项目(通关版) 一、概述 使用 java -jar 命令直接部署项目的JAR包和使用Docker制作镜像进行部署是两种常见的部署方式。以下是对这两种方式的概述和简要的优劣势分析: 1.1、使用 java -jar 命令直接部署项目的JAR包 概述: 通过 java -jar
SpringBoot+Docker +Nginx 部署前后端项目 SpringBoot+Docker +Nginx 部署前后端项目 SpringBoot+Docker +Nginx 部署前后端项目
从零开始学机器学习——线性和多项式回归
首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns 在之前的学习中,我们已经对数据的准备工作以及数据可视化有了一定的了解。今天,我们将深入探讨基本线性回归和多项式回归的概念与应用。 如果在过程中涉及到一些数学知识,大家也不必感到畏惧,我会逐步为大家进行
从零开始学机器学习——线性和多项式回归 从零开始学机器学习——线性和多项式回归 从零开始学机器学习——线性和多项式回归
【VMware VCF】使用 VCF Import Tool 将现有 vSphere 环境导入为 VI 域。
VCF Import Tool 工具使用两种方式来帮助客户将现有的 vSphere 或 vSphere + vSAN 环境转变为 VMware Cloud Foundation 环境,分别是转换(Convert)和导入(Import)。之前在这篇(使用 VCF Import Tool 将现有 vSp
【VMware VCF】使用 VCF Import Tool 将现有 vSphere 环境导入为 VI 域。 【VMware VCF】使用 VCF Import Tool 将现有 vSphere 环境导入为 VI 域。 【VMware VCF】使用 VCF Import Tool 将现有 vSphere 环境导入为 VI 域。
Java实现随机抽奖的方法有哪些
在Java中实现随机抽奖的方法,通常我们会使用类来生成随机数,然后基于这些随机数来选择中奖者。本文给出了几种常见的随机抽奖实现方式,包括从数组中抽取、从列表中抽取以及基于权重的抽奖方式。
【翻译】实现 Blocked Floyd-Warshall 用于解决所有对最短路径问题 C# 实现
介绍 在之前的帖子中,我们实现了Floyd-Warshall(弗洛伊德-沃沙尔算法)(四种变体)以及路由重建算法。在这些帖子中,我们探讨了所有对最短路径问题的基本概念、内存中的数据表示、并行性、向量化以及如何将算法调整为适应数据特性。 在本帖中,我们将继续我们的旅程,探索一种更高效的方法来解决所有对
【翻译】实现 Blocked Floyd-Warshall 用于解决所有对最短路径问题 C# 实现 【翻译】实现 Blocked Floyd-Warshall 用于解决所有对最短路径问题 C# 实现 【翻译】实现 Blocked Floyd-Warshall 用于解决所有对最短路径问题 C# 实现
关于虚树
关于虚树 \(\large 9.29\ upd:\) 更新了二次排序。 瞎扯 某些树上问题,给了巨多节点,而实际上它们之中只有小部分能做出贡献,其余都是些水军,为杀尽 OIers的脑细胞 做出努力 考虑重新种一棵树,浓缩信息,简化节点个数,于是产生了 虚树。 大概是长这个样子: 红色结点是我们选择的
关于虚树 关于虚树 关于虚树
.NET 跨平台工业物联网网关解决方案
前言 随着工业4.0时代的到来,物联网技术正在以前所未有的速度改变着我们的生产和生活方式。本文给大家介绍一个基于 .NET 6 开发的跨平台工业物联网网关解决方案。 工业物联网(IIoT)成为了连接物理世界与数字世界的纽带。而在这个网络中,工业物联网网关就像是一个智能的交通警察,负责指挥着设备与云端
.NET 跨平台工业物联网网关解决方案 .NET 跨平台工业物联网网关解决方案 .NET 跨平台工业物联网网关解决方案
深入理解 Nuxt.js 中的 app:data:refresh 钩子
title: 深入理解 Nuxt.js 中的 app:data:refresh 钩子 date: 2024/9/29 updated: 2024/9/29 author: cmdragon excerpt: 摘要:本文详细介绍了 Nuxt.js框架中的app:data:refresh钩子,包括其定义
深入理解 Nuxt.js 中的 app:data:refresh 钩子 深入理解 Nuxt.js 中的 app:data:refresh 钩子