【JS】1676- 重学 JavaScript API - Page Visibility API

news2024/11/17 2:49:18

1a5df06289d49b7e162b6910028c6f85.jpeg

在前端开发中,我们经常需要根据页面的可见性来控制资源的使用和提高页面的性能和响应速度。而 JavaScript 中的 Page Visibility API[1] 就提供了一种「检测页面是否可见」的方法。

本文将介绍 Page Visibility API 的概念、使用方法、兼容性和实际应用案例。

什么是 Page Visibility API?

Page Visibility API 是一种浏览器 API,它提供了一种「检测页面是否可见」的方法。通过 Page Visibility API,我们可以知道「当前页面是否被隐藏或者最小化」,从而可以根据页面的可见性来控制页面的行为和资源的使用。

Page Visibility API 提供了 2 个属性和 1 个事件,分别是:

1. 属性

  1. document.hidden:只读,表示「当前页面是否被隐藏」,如果页面被隐藏返回 true,否则返回 false

  2. document.visibilityState:只读,表示「当前页面的可见性状态」,可能的取值有:

  • visible:当前页面可见,即页面是非最小化窗口的前景选项卡。

  • hidden:当前页面被隐藏,即页面可以是一个后台标签,或是最小化窗口的一部分,或是在操作系统锁屏激活的状态下。

  • prerender:当前页面正在预加载。

  • unloaded:当前页面正在卸载,部分浏览器不支持。

2. 方法

  • visibilitychange:当页面的可见性状态发生变化时触发该事件。

Page Visibility API 的使用场景

Page Visibility API 可以应用于很多场景,比如:

  1. 视频播放器

在视频播放期间,可以使用 Page Visibility API 来检测页面是否可见。如果页面不可见,可以通过暂停视频来节省资源和带宽。当页面重新变为可见时,可以恢复播放。

  1. 实时消息通知

如果我们网页需要向用户发送实时通知,就可以使用 Page Visibility API 来检测页面是否可见,如果页面不可见,就不会发送通知。当用户重新打开页面时,我们可以再次检查,并确保他们看到任何未读消息。

  1. 自动保存表单数据

如果用户在表单上输入了大量数据,而且在填写过程中离开了页面,我们可以使用 Page Visibility API 确定何时离开页面,并自动保存表单数据,以便以后再次访问。

  1. 游戏应用程序

如果我们正在开发一个基于 Web 的游戏,就可以使用 Page Visibility API 暂停和恢复游戏,以便玩家能够在离开游戏时不会丢失任何进度。

  1. 网页埋点统计分析

使用 Page Visibility API 可以收集更准确的访问次数,以便更好地分析用户行为。

  1. 网页性能测量

使用 Page Visibility API 可以测量页面加载时间和页面卸载时间,帮助您优化网站性能。

  1. 页面缓存

如果使用 Page Visibility API 的网站被用户退出,那么通过记录缓存状态,可以更好地管理页面的缓存,以便下次更快的访问。

当然还有更多使用场景,本文不再过多介绍。

如何使用 Page Visibility API?

使用 Page Visibility API 非常简单,只需要在 JavaScript 中监听 visibilitychange 事件即可。以下是一个简单的示例:

document.addEventListener("visibilitychange", function () {
  if (document.hidden) {
    // 页面被隐藏
  } else {
    // 页面可见
  }
});

在以上示例中,我们使用了 visibilitychange 事件来监听页面的可见性状态变化,当页面被隐藏时,我们可以执行一些操作,当页面重新可见时,我们也可以执行一些操作。

Page Visibility API 的兼容性

Page Visibility API 并不是所有浏览器都支持,我们需要在使用之前检查浏览器是否支持该 API。以下是一些浏览器的支持情况:

  • Chrome:支持。

  • Firefox:支持。

  • Safari:支持。

  • IE:支持 IE10+。

  • Edge:支持。

bc067bd317a3f05ab4bde323386c5d1d.png

详细可以查看 「Page Visibility API[2]」。

如果需要兼容不支持 Page Visibility API 的浏览器,我们可以使用 Polyfill 或者其他的检测方法来实现。

Page Visibility API 的实际应用案例

以下是一些 Page Visibility API 的实际应用案例:

1. 根据页面的可见性来控制视频播放

点击 demo[3] 查看。

2. 根据页面的可见性来控制动画执行

在页面中创建小球,其位置随着时间的推移而变化。使用 Page Visibility API,可以在页面不可见时停止动画,并在页面重新变为可见时恢复动画。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Animation Control Using Page Visibility API</title>
    <style>
      #ball {
        width: 50px;
        height: 50px;
        border-radius: 50%;
        background-color: red;
        position: absolute;
        top: 0;
        left: 0;
      }
    </style>
  </head>

  <body>
    <div id="ball"></div>
    <script>
      window.addEventListener("DOMContentLoaded", function () {
        var ball = document.getElementById("ball");
        ball.style.top = 0;
        ball.style.left = 0;
        var speedX = 2;
        var speedY = 3;
        function move() {
          var top = parseFloat(ball.style.top);
          var left = parseFloat(ball.style.left);

          // 确保小球不会移出屏幕
          if (top < 0 || top > window.innerHeight - 50) {
            speedY = -speedY;
          }
          if (left < 0 || left > window.innerWidth - 50) {
            speedX = -speedX;
          }
          ball.style.top = top + speedY + "px";
          ball.style.left = left + speedX + "px";
        }

        var timer = setInterval(function () {
          move();
        }, 10);

        document.addEventListener("visibilitychange", function () {
          if (document.visibilityState === "hidden") {
            clearInterval(timer);
          } else {
            timer = setInterval(function () {
              move();
            }, 10);
          }
        });
      });
    </script>
  </body>
</html>

其中 setInterval() 是一个循环函数,它可以连续执行函数的代码,实现动画效果。在本例中,move() 函数不断修改球的位置(通过修改 CSS 中的 topleft 属性),并在达到屏幕边缘时将其反转。页面可见性通过 visibilitychange 事件进行监测,当页面从可见到不可见时停止动画,反之则恢复动画。

总结

通过本文的介绍,我们了解了 Page Visibility API 的概念、使用方法、兼容性和实际应用案例。在实际开发中,我们可以根据页面的可见性来控制资源的使用,提高用户体验和性能优化。如果你想深入了解 Page Visibility API,可以参考以下文档:

  • MDN 文档[4]

  • W3C 规范[5]

Reference

[1]

Page Visibility API: https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API

[2]

Page Visibility API: https://caniuse.com/?search=Page%20Visibility%20API

[3]

demo: https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API#examples

[4]

MDN 文档: https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API

[5]

W3C 规范: https://www.w3.org/TR/page-visibility/

往期回顾

#

如何使用 TypeScript 开发 React 函数式组件?

#

11 个需要避免的 React 错误用法

#

6 个 Vue3 开发必备的 VSCode 插件

#

3 款非常实用的 Node.js 版本管理工具

#

6 个你必须明白 Vue3 的 ref 和 reactive 问题

#

6 个意想不到的 JavaScript 问题

#

试着换个角度理解低代码平台设计的本质

b48b8666618cdea578c62712e1820e99.gif

回复“加群”,一起学习进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/504634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【负载均衡式的在线oj(1.compile_runner_server模块)】

&#x1f389;实战项目&#xff1a;负载均衡式在线OJ 博主主页&#xff1a;桑榆非晚ᴷ 博主能力有限&#xff0c;如果有出错的地方希望大家不吝赐教 给自己打气&#xff1a;成功没有快车道&#xff0c;幸福没有高速路。所有的成功&#xff0c;都来自不倦地努力和奔跑&#xf…

并发编程07:CAS

文章目录 7.1 原子类7.2 没有CAS之前7.3 使用CAS之后7.4 是什么&#xff1f;7.5 CAS底层原理&#xff1f;谈谈对Unsafe类的理解&#xff1f;7.5.1 Unsafe7.5.2 源码分析7.5.3 底层汇编 7.6 原子引用7.7 CAS与自旋锁&#xff0c;借鉴CAS思想7.7.1 是什么&#xff1f;7.7.2 自己实…

K8S管理系统项目实战[API开发]-1

前端: Vueelement plus 后端: gogin kubernetes v1.24.2 golang v1.18.3 后端代码地址GitHub - yunixiangfeng/k8s-platform: K8s管理系统后端: gogin Go 快速入门 Gin Web框架 K8s管理系统项目实战[API开发] 项目背景&#xff0c;整体设计&#xff0c;Client-go&#x…

代码随想录算法训练营day34 | 1005.K次取反后最大化的数组和 ,134. 加油站,135. 分发糖果

代码随想录算法训练营day34 | 1005.K次取反后最大化的数组和 &#xff0c;134. 加油站&#xff0c;135. 分发糖果 1005.K次取反后最大化的数组和解法一&#xff1a;两次正常排序解法二&#xff1a;一次排序 134. 加油站135. 分发糖果 1005.K次取反后最大化的数组和 教程视频&a…

生态系统服务(InVEST模型应用)

白老师&#xff08;研究员&#xff09;&#xff1a;长期从事生态系统结构-格局-过程-功能-服务的变化与响应关系等研究工作&#xff1b;重点围绕生物多样性、生态系统服务与价值等&#xff0c;构建生物地球化学模型和评价指标体系&#xff0c;为城市、区域和自然保护区的可持续…

sqli-labs通关(二十三)

第二十三关 这一关是get类型 当输入?id1时&#xff0c;出现报错信息&#xff0c;是由单引号闭合的 但是输入?id1--的时候&#xff0c;还是报错&#xff0c;说明我们的注释符可能被过滤处理了 查看码源&#xff0c;确实是把注释符过滤了 那我们还是根据语句构造 ?id1 or 1…

本地使用3台centos7虚拟机搭建K8S集群教程

第一步 准备3台centos7虚拟机 3台虚拟机与主机的网络模式都是桥接的模式&#xff0c;也就是他们都是一台独立的“主机” &#xff08;1&#xff09;kebe-master的配置 虚拟机配置&#xff1a; 网络配置&#xff1a; &#xff08;2&#xff09;kebe-node1的配置 虚拟机配…

(二)用Qt实现登录界面——打造简洁、美观的登录体验

文章目录 一、引言1、什么是Qt框架&#xff0c;其主要特点是什么&#xff1f;2、Qt框架的应用范围&#xff0c;如何在不同的平台上开发应用程序&#xff1f;3、Qt框架的优点和劣势&#xff0c;与其他框架的比较。 二、相关技术1、socket编程 三、Qt框架的使用1、Qt框架的基本概…

数据库与身份认证

目录 1.数据库的基本概念 1.1什么是数据库 1.2常见的数据库及分类 1.3传统型数据库的数据组织结构 2.安装并配置MySQL 2.1了解需要安装哪些MySQL相关的软件 2.2 MySQL在 Windows 环境下的安装 3.MySQL的基本使用 3.1使用 MySQL Workbench 管理数据库 3.1.1连接数据库…

CSS 圆锥渐变+MASK遮罩实现WIFI图标

前言 &#x1f44f;CSS 圆锥渐变MASK遮罩实现WIFI图标&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 定义css变量–bg背景色&#xff0c;–dot弧宽度&#xff0c;–w父元素宽度&#xff0c;–gap&#xff0c…

docker安装elasticsearch

前言 安装es么&#xff0c;也没什么难的&#xff0c;主要网上搜一搜&#xff0c;看看文档&#xff0c;但是走过的坑还是需要记录一下的 主要参考这三份文档&#xff1a; Running the Elastic Stack on Docker docker简易搭建ElasticSearch集群 Running Kibana on Docker …

模型优化-剪枝 (一)非结构化剪枝

环境 python 3.9numpy 1.24.1pytorch 2.0.0+cu117非结构剪枝 特点 1.简单,将满足某些田间的 weight 置为0即可 2.pytorch容易访问所有参数(weight) 3.最精细化 类型 1.细粒度剪枝(fine-grained) …

数据库创建与管理

目录 一、创建数据库 1&#xff0e;准备创建数据库 2&#xff0e;创建数据库实例分析 方法一&#xff1a;使用对象资源或企业管理器创建数据库 方法二&#xff1a;使用Transact-SQL命令创建数据库 二、管理数据库 1&#xff0e;修改数据库 使用SQL命令修改数据库 2&…

珞珈一号夜间灯光数据处理流程

一、前言 “珞珈一号”卫星是长光卫星技术有限公司首次通过商业化订单为武汉大学研制的卫星,是全球首颗专业夜光遥感卫星,主要用于夜光遥感及导航增强技术验证。卫星整星重量仅为20kg,携带的大视场高灵敏夜光遥感相机,具备130m分辨率、260km幅宽的夜光成像能力,为基于夜光…

【全国大学生统计建模大赛】2023年统计建模大赛赛题解读

目录 关于中国式现代化统计测度的几点思考 &#xff08;一&#xff09;房祥忠教授——大局层面 一、现代化释义 二、现代化度量的单变量方法 2.1 单一变量情形 2.2 分组评分 三、现代化度量的多变量方法 3.1 问题 3.2 解决方法 四、现代化度量的理想化方法 4.1 问题 …

SSM整合详细教学(中)

SSM整合详细教学&#xff08;中&#xff09; 三、异常处理器问题导入1 异常介绍2 异常处理器2.2.1 编写异常处理器2.2.2 RestControllerAdvice注解介绍2.2.3 ExceptionHandler注解介绍 四、项目异常处理方案问题导入1 项目异常分类2 项目异常处理方案3 项目异常处理代码实现3.1…

zookeeper下载安装集群部署

文章目录 一、zookeeper官网下载二、JDK环境安装三、zookeeper安装1.zookeeper解压2.zookeeper配置文件介绍 克隆服务器1.网络检查2.集群配置3.启动集群 一、zookeeper官网下载 下载地址&#xff1a;https://archive.apache.org/dist/zookeeper/找到对应的版本下载 二、JDK环…

Python3.10动态修改Windows系统(win10/win11)本地IP地址(静态IP)

一般情况下&#xff0c;局域网里的终端比如本地服务器设置静态IP的好处是可以有效减少网络连接时间&#xff0c;原因是过程中省略了每次联网后从DHCP服务器获取IP地址的流程&#xff0c;缺点是容易引发IP地址的冲突&#xff0c;当然&#xff0c;还有操作层面的繁琐&#xff0c;…

SpringBoot ( 一 ) 搭建项目环境

1.搭建环境 1.1.创建项目向导 使用idea中的向导创建SpringBoot项目 1.1.1.建立新的项目 位置 : 菜单 > File > New > Project… 1.1.2.选择向导 默认的向导URL 是 https://start.spring.io 建议使用 https://start.aliyun.com 1.1.3.配置项目信息 Group : 组织…

从地方旅游的宣传谈起:如何吸引主流媒体报道,强势刷屏?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 五一小长假已经过去好几天了&#xff0c;大家渐渐的从假期舒适的闲暇转到正常的工作生活中了&#xff0c;但利用五一热点宣传的余温还在继续&#xff0c;今天胡老师就i注意到一篇题为&am…